developer tip

정말로 더 성능이 좋은 것은 무엇입니까?

copycodes 2021. 1. 5. 08:14
반응형

정말로 더 성능이 좋은 것은 무엇입니까? Haskell 또는 OCaml


저는 지난 18 개월 동안 OCaml을 배우는 것부터 시작하여 이제 몇 주 동안 Haskell을 배우면서 함수형 프로그래밍에 익숙해졌습니다. 이제 다음 단계를 수행하여 실제 응용 프로그램 인 간단한 실시간 지형 편집기를 구현하려고합니다. 저는 수많은 실시간 지형 렌더링 엔진을 작성 했으므로 이것은 친숙한 주제입니다. 그리고 사용 된 재귀 알고리즘과 데이터 구조는 기능적 구현에 매우 적합합니다.

이것이 실시간 애플리케이션이기 때문에 자연스럽게 얻을 수있는 최고의 성능을 찾고 있습니다. 이제 OCaml을지지하는 일부 (IMHO는 상당히 성가신) Haskell이 OCaml 또는 F #에 비해 느리다는 것에 대해 꽤 자주 암컷을 만듭니다. 그러나 The Computer Language Benchmarks Game 에 따르면 Haskell은 종종 OCaml을 능가합니다. 비록 아주 작은 부분에 의해서만이기는 경우가 있습니다.이 벤치 마크는 매우 구체적인 샘플 만 취한다는 문제가 남아 있습니다.

옳은 일은 물론 두 언어로 프로그램을 구현하고 비교하는 것입니다.하지만 저는 단순히 이중 작업을하고 싶지 않습니다.

그러나 다른 사람들이 OCaml과 Haskell에서 비슷한 응용 프로그램을 수행하고 수치를 제공했을까요?


모든 계정에서 OCaml과 Haskell은 거의 모든 것에 대해 충분히 성능이 좋은 컴파일러와 런타임을 가지고 있습니다. 순수한 성능을 기준으로 그들 사이를 선택하는 것은 나에게 어리석은 것처럼 보입니다. 당신은 여기까지 왔습니다. 가장 명확하고 간결하며 표현력이 뛰어나고 높은 수준의 코드라는 이름으로 분명히 가장 낮은 수준의 성능이 뛰어난 언어 (C, C ++ 등)에서 멀어졌습니다. 그렇다면 관련된 성능 차이가 훨씬 적을 때 지금 해당 기준으로 전환하는 이유는 무엇입니까?

나는 좀 더 광범위한 기준을 가지고 갈 것입니다-만약 당신이 퍼베이시브 병렬성을 원한다면 Haskell이 더 나은 선택입니다. 진정으로 퍼베이시브 한 돌연변이를 원한다면 OCaml이 더 좋습니다.

기껏해야 매우 거친 병렬 처리만을 원하고 대부분의 기능적 구조를 고수하려는 경우 구문 (Haskell이 여기에서 훨씬 더 멋지지만 주관적이라고 생각합니다) 또는 사용 가능한 라이브러리 (Haskell이 수량에서 승리)와 같은 다른 항목을 기반으로 선택합니다. / availability, 그러나 OCaml은 그럼에도 불구하고 그래픽 부서에서 그것을 능가 할 수 있습니다).

나는 당신이 어느 쪽이든 잘못 될 것이라고 생각하지 않습니다.


두 명의 똑똑한 동료의 도움을 받아 Objective Caml과 Haskell 모두에 데이터 흐름 최적화 라이브러리를 작성했습니다. Haskell 버전은 좀 더 다형성이고 컴파일 타임 유형 검사가 더 많으므로 런타임 검사가 적습니다. OCaml 버전은 변경 가능한 상태를 사용하여 데이터 흐름 사실을 축적하는데, 이는 달의 위상에 따라 이번 주에 더 빠르거나 느려질 수 있습니다. 핵심 사실은 의도 된 응용 프로그램에서 두 라이브러리가 너무 빠르기 때문에 . 즉, 각 컴파일러 ( Quick C--GHC )에서 데이터 흐름 최적화에 소요되는 시간이 거의 없어 코드를 개선 할 가치가 없습니다.

벤치마킹은 지옥입니다.


저는 수많은 실시간 지형 렌더링 엔진을 작성 했으므로 이것은 친숙한 주제입니다.

대부분의 시간을 어디에서 보낼지 충분히 알고 계십니까?

그렇다면 해당 부분대한 코드 다른 언어로 작성하고 비교할 수 있습니다.

그러나 The Computer Language Benchmarks Game에 따르면 Haskell은 종종 OCaml을 능가합니다. 비록 아주 작은 부분에 의해서만이기는 경우가 있습니다.이 벤치 마크는 매우 구체적인 샘플만을 취한다는 문제가 남아 있습니다.

벤치 마크 게임은 4 개의 결과 세트 (하나의 코어 및 쿼드 코어 , 32 비트 또는 64 비트 Ubuntu)를보고하며 플랫폼에 따라 OCaml 또는 Haskell 벤치 마크 프로그램의 성능이 더 좋거나 나쁘다는 것을 알 수 있습니다.

벤치 마크가 할 수있는 일은 매우 구체적인 샘플을 취하는 것뿐입니다. 물론 애플리케이션에서 대부분의 시간이 소요되는 작업 (대정 수 산술)에 대한 비교는 무시해야합니다. 정규식? 문자열? -그리고 당신이하려는 것과 가장 유사한 비교를보십시오.


내가 본 모든 데이터를 기반으로 볼 때 거의 비슷합니다. 작성하는 코드는 언어 자체보다 더 큰 차이를 만들 것입니다.


흥미로운 질문입니다. 전체 행성 지형 렌더러 는 내가 OCaml로 마이그레이션하기 전에 C ++로 작성한 마지막 프로그램 중 하나였습니다. 되돌아 보면이 프로그램은 C ++보다 OCaml로 작성하기가 훨씬 쉬웠을 것입니다. Haskell은 비교적 쉽게 만들 수 있지만 프로그램은 일반적으로 Haskell에서 최적화하기가 훨씬 더 어렵습니다. 이론적으로 Haskell은 멀티 코어를 더 잘 지원하지만 실제로 전문가조차도 병렬 프로그래밍에 Haskell을 사용하여 적절한 결과를 얻는 경우는 거의 없습니다.

또한 실시간 애플리케이션의 경우 가비지 수집기에서 낮은 일시 중지 시간도 필요합니다. OCaml에는 30ms 이상의 일시 중지가 거의 발생하지 않는 멋진 증분 수집기가 있지만 IIRC, GHC에는 임의로 긴 일시 중지를 발생시키는 세계 중지 수집기가 있습니다.

Linux 또는 F #을 사용하는 것이 OCaml 또는 Haskell보다 훨씬 더 나은 선택이라고 가정합니다.

편집 : 총격전을 연구하고 싶다면 소스 코드를 읽으십시오. 흥미로운 Haskell 위키 페이지를 찾을 수도 있습니다 .

참조 URL : https://stackoverflow.com/questions/4308137/whats-really-more-performant-haskell-or-ocaml

반응형