web-dev-qa-db-ja.com

本当にパフォーマンスが高いのは何ですか? HaskellまたはOCaml

OCamlの学習から始めて、数週間はHaskellを使い始めて、私はこの18か月を関数型プログラミングの理解に費やしました。次に、次のステップに進み、実際のアプリケーションを実装します。シンプルなリアルタイムテレインエディターです。多数のリアルタイムの地形レンダリングエンジンを作成したため、これはよく知られたトピックです。また、使用される再帰アルゴリズムとデータ構造は、機能的な実装に非常に適しているようです。

これがリアルタイムアプリケーションであるため、私は当然、最高のパフォーマンスを求めています。現在、一部の(IMHOは非常に迷惑な)OCamlの支持者は、OCamlまたはF#に比べてHaskellが遅いことに対してかなり頻繁に愚痴を言います。しかし The Computer Language Benchmarks Game によれば、HaskellはOCamlをしばしばわずかな割合で破ります-問題が残っており、このベンチマークは非常に特定のサンプルしか取らないという問題が残っています。

正しいことはもちろん、両方の言語でプログラムを実装し、比較することですが、私は単に二重の仕事をしたくありません。

しかし、他の人がOCamlとHaskellで同等のアプリケーションを実行し、いくつかの数字を与えたのでしょうか?

55
datenwolf

すべてのアカウントで、OCamlとHaskellの両方には、ほぼすべてに対して十分なパフォーマンスのコンパイラとランタイムがあります。純粋なパフォーマンスに基づいてそれらの間を選択することは、私には愚かに思えます。ここまで来ました-明確で、より簡潔で、より表現力のある、より高いレベルのコードの名のもとで、明らかに最も低レベルでパフォーマンスの高い言語(C、C++など)から離れています。なぜ、関連するパフォーマンスの差がはるかに小さい場合、今すぐその基準に切り替えるのですか?

私はいくつかのより広い基準を採用します-もしあなたが広汎な並列性を望むなら、Haskellがより良い選択です。本当に広範にわたる突然変異が必要な場合は、OCamlの方が適しています。

せいぜい非常に粗い並列処理だけが必要で、ほとんど機能的な構造に固執する場合は、構文(Haskellの方がはるかに優れていると思いますが、主観的です)または利用可能なライブラリ(Haskellが量に勝っています)/availabilityですが、OCamlはそれでもグラフィック部門で優位に立つ可能性があります)。

私はあなたがどちらかといえば間違っているとは思わない

60
sclv

2人の非常に優秀な同僚の助​​けを借りて、Objective CamlとHaskellの両方でデータフロー最適化ライブラリを作成しました。 Haskellバージョンはもう少しポリモーフィックであり、コンパイル時の型チェックが多いため、実行時チェックが少なくなります。 OCamlバージョンは、可変状態を使用してデータフローファクトを蓄積します。これは、月の位相に応じて、今週はより高速または低速になる可能性があります。重要な事実は、目的のアプリケーションでは、両方のライブラリは非常に高速であるため、にだまされる価値はありません。つまり、それぞれのコンパイラ( Quick C- および [〜#〜] ghc [〜#〜] )では、データフローの最適化にほとんど時間を費やさないため、コードを改善する価値はありません。

ベンチマークは地獄です。

38
Norman Ramsey

多数のリアルタイムの地形レンダリングエンジンを作成したため、これはよく知られたトピックです。

ほとんどの時間がどこに費やされるかを知るのに十分な知識がありますか?

もしそうなら、多分あなたはコードを書くことができますその部分のみ異なる言語で比較してください。

しかし、The Computer Language Benchmarks Gameによると、HaskellはOCamlをしばしばわずかな割合で破ります。このベンチマークは非常に特定のサンプルのみを取得するという問題が残っています。

ベンチマークゲームでは、1セットのコアと クアッドコア 、32ビットまたは64ビットUbuntuの4セットの結果が報告されます。OCamlまたはHaskellベンチマークプログラムは、プラットフォームに応じてパフォーマンスが向上または低下することがあります。

ベンチマークでできることは、非常に具体的なサンプルを取得することだけです。もちろん、アプリケーションで大部分の時間を費やす場所とは異なるタスクの比較は無視する必要があります。正規表現?ひも? -そして、あなたがやろうとしているものに最も似ている比較を見てください。

24
igouy

興味深い質問。この 全惑星地形レンダラー は、OCamlに移行する前にC++で書いた最後のプログラムの1つでした。振り返ってみると、そのプログラムはC++よりもOCamlで書く方がはるかに簡単だったでしょう。 Haskellは比較的簡単にできるはずですが、プログラムは通常muchHaskellで最適化するのが難しいです。理論的には、Haskellはマルチコアのサポートが優れていますが、実際には、並列プログラミングにHaskellを使用しても、専門家でさえまともな結果を得ることはめったにありません。

また、リアルタイムアプリケーションの場合は、ガベージコレクターからの短い休止時間も必要になります。 OCamlには、30ミリ秒を超える休止がほとんどないニースのインクリメンタルコレクタがありますが、IIRC、GHCには、任意の長さの休止が発生する世界停止コレクタがあります。

LinuxまたはF#を使用しているのは、OCamlやHaskellよりもずっと良い選択だと思います。

編集:銃撃戦を勉強したい場合は、ソースコードを読んでください。 Haskellのwikiページ おもしろいかもしれません。

19
Jon Harrop

私が見たすべてのデータに基づいて、それらはほぼ同等です。記述したコードは、言語自体よりも大きな違いをもたらします。

19
Chuck