web-dev-qa-db-ja.com

Haskell、Scala、Clojure、高性能なパターンマッチングと同時実行性のために選択するもの

並行実行とパフォーマンスに対するFPの利点に関する多くのブログと投稿を読んだ後、最近FPの作業を開始しました。 FPの必要性は、開発中のアプリケーションに大きく影響されています。私のアプリケーションは、タイミングが非常に重要な別のサブシステムへの状態ベースのデータインジェクターです(1秒あたり200万トランザクションに近い)。テストする必要のあるこのようなサブシステムがいくつかあります。 FPを使用して並列処理を行うことを真剣に検討しており、正しいアプローチを取りたいと考えています。SOの多くの投稿では、Scala、Haskell、 JVMサポート。言語の観点からは、結果を達成するのに役立つ限り、どの言語を学んでも構いません。

特定の投稿は、パターンマッチングと言語のシンプルさのためにHaskellを支持しています。JVMベースのFP langは、既存のJavaライブラリの使用に関して大きな利点があります。 JaneStreetは大きなOCAMLサポーターですが、OCAMLの開発者サポートとヘルプフォーラムについては本当に確信がありません。

誰かがそのような大きなデータの処理に取り組んでいるなら、あなたの経験を共有してください。

41
2ndlife

欲しいですかfastまたは欲しいですかeasy

速くしたい場合は、正確性を高めるためにFP原則を使用している場合でも、C++を使用する必要があります。タイミングが重要であるため、ソフト(必要に応じてハード)のサポートは本物です)メモリを回復する時間と方法を正確に決定し、そのタスクに費やした時間だけを費やすことができます。

あなたが述べた3つの言語はすべて ほぼ最適に調整されたC++よりも2〜3倍遅い傾向があります であり、それからむしろ伝統的な命令的な方法で使用された場合のみです。それらはすべてガベージコレクションを使用します。これにより、トランザクションに制御されないランダムな遅延が発生します。

さて、それは、これをC++で安全に実行するためのlot作業です。 FPの原則を適用すると、かなり多くの定型文が必要になり(C++ 11でも)、ほとんどのライブラリはデフォルトで変更可能です。(編集:Rust代替案ですが、Rustを十分に詳細に記述することはこの回答の範囲外です。)

たぶんあなたには時間がなく、他の仕様を縮小する余裕があるかもしれません。たとえば、timingではなく、throughputが重要な場合、その後、おそらくScala over Clojure( Computer Languages Benchmark Game を参照) Scalaこの執筆時点ですべてのベンチマークに勝つandはほとんどすべてのケースでコードサイズが小さい(編集:CLBGはこの点に関しては、Webアーカイブでこれらのステートメントをサポートするアーカイブを見つけることができますが)、これに関してはもう役立ちます); OCamlとHaskellは、他の理由で選択する必要があります(同様のベンチマークスコアですが、構文と相互運用性が異なります)。

どのシステムが最高の同時実行性サポートを備えている限り、Haskell、Clojure、およびScalaはすべて問題ありませんが、OCamlは少し不足しています。

これにより、HaskellとScalaにかなり絞り込むことができます。 Javaライブラリ?Scala。Cライブラリを使用する必要がありますか?Haskellを使用する必要があります。どちらも必要ありませんか?次に、どちらを選択するかを選択できます。間違ったものを選択することであなたの人生が非常に難しくなることを過度に心配する必要があります。

51
Rex Kerr

私はこれをClojureで実行しましたが、次の理由で非常に効果的でした。

  • JVM上にいることは、ライブラリの点での大きな利点です。 JavaエコシステムおよびJVMベースのツールとの統合(Mavenビルドなど)に簡単にアクセスする必要があるため、HaskellとOcamlを事実上除外しました。
  • 内部ループを厳密に最適化する必要がある場合は、純粋なJavaにドロップできます。大きなdouble []配列を処理するカスタムコードに対してこれを行いましたが、Clojureでパフォーマンスを得ることができますClojureを非常に高速にする方法の例については、 http://www.infoq.com/presentations/Why-Prismatic-Goes-Faster-With-Clojure を参照してください(非常に技術的なビデオ、複数のコアの活用のしやすさを数え始めると、Clojureはパフォーマンスに関して非常に競争力があります。
  • Clojureは非常に素晴らしいマルチコア同時実行性をサポートしています。これは、並行タスクの管理に非常に役立つことが証明されました。 http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey を参照してください
  • REPLは、データのテストおよび探索作業に非常に適した環境になります。
  • Clojureはlazyです。これは、メモリよりも大きいデータセットの処理に適しています(データセット全体をメモリに強制的に入れないように注意している場合)すぐに)。そのような環境で利用できるいくつかのNiceライブラリもあります。最も注目すべきは Storm および Aleph です。 Stormは、多数のイベントの分散リアルタイム処理用に設計されているため、特に興味深い場合があります。

他の言語の経験はあまりありませんが、HaskellとScalaの実際の経験からの印象は:

  • Haskellは、静的型を使用した純粋で厳密な関数型プログラミングに関心がある場合に最適です。静的型付けは正確性の強力な保証となるため、これを高度なアルゴリズム作業に適したものにすることができます。個人的には、純粋なFP alittleが硬すぎる-可変状態が有用であり、私は思うClojureは、ここでわずかに優れたバランスを持っています(管理された参照を介して制御された可変性を許可することにより)。
  • Scalaは素晴らしい言語であり、ClojureとJVM上にあることの利点を共有しています。私にとってScalaは機能的な機能と非常に印象的な型システムを備えた「より良いJava」のようなものです。Clojureからのパラダイムシフトではありません。欠点は型システムが非常に複雑になることです/紛らわしい。

全体として、これらのいずれかに満足できると思います。それはおそらく、JVMと型システムに対するあなたの見方にどれだけ気を配ることになるでしょう。

26
mikera