44

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

一部の投稿では、パターン マッチングと言語の単純さのために Haskell が好まれています。JVM ベースの FP 言語は、既存の Java ライブラリの使用に関して大きな利点があります。JaneStreet は OCAML の熱心な支持者ですが、OCAML の開発者サポートとヘルプ フォーラムについてはよくわかりません。

このような大規模なデータを処理したことがある人は、その経験を共有してください。

4

2 に答える 2

53

あなたは速くしたいですか、それとも簡単にしたいですか?

正確性を高めるために FP の原則を使用している場合でも、速くしたい場合は C++ を使用する必要があります。タイミングが重要であるため、ソフト (および必要に応じてハード) リアルタイム プログラミングのサポートが重要になります。いつ、どのように記憶を回復するかを正確に決めることができ、そのタスクにできるだけ多くの時間を費やすことができます。

あなたが述べた3つの言語はすべて、ほぼ最適に手動で調整されたC++よりも2〜3倍遅く、従来の命令的な方法で使用された場合にのみ. それらはすべてガベージ コレクションを使用するため、トランザクションで制御不能なランダムな遅延が発生します。

とはいえ、これを C++ で完全に実行するのは大変な作業です。FP 原則を適用するには、(C++11 であっても) かなり多くのボイラープレートが必要であり、ほとんどのライブラリはデフォルトで変更可能です。(編集:Rustは良い代替手段になりつつありますが、Rustを十分に詳細に説明することは、この回答の範囲を超えています。)

時間がなく、他の仕様に縮小する余裕があるかもしれません。たとえば、重要なのはタイミングではなくスループットである場合は、 Clojureよりも Scala を使用することをお勧めします ( Computer Languages Benchmark Gameを参照してください。この記事の執筆時点は、Scala がすべてのベンチマークで勝利し、ほとんどすべてのケースでコード サイズが小さくなっています (編集:この点に関して CLBG はもはや役に立ちませんが、Web アーカイブでこれらの声明を裏付けるアーカイブを見つけることができます)); OCaml と Haskell は、別の理由で選択する必要があります (ベンチマーク スコアは似ていますが、構文や相互運用性が異なるなど)。

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

これにより、Haskell と Scala にかなり絞り込まれます。Java ライブラリを使用する必要がありますか? スカラ。C ライブラリを使用する必要がありますか? おそらくハスケル。どちらも必要ありませんか?次に、間違ったものを選択して人生が非常に困難になったことを過度に心配することなく、スタイル的に好むものに基づいてどちらかを選択できます。

于 2012-07-23T06:23:54.933 に答える
27

私はこれを Clojure で行いました。これは、次の理由で非常に効果的であることが証明されています。

  • JVM上にあることは、ライブラリに関して大きな利点です。Javaエコシステムへの簡単なアクセスとJVMベースのツール(Mavenビルドなど)との統合が必要だったので、これは私の目的のためにHaskellとOcamlを事実上除外しました.
  • 内部ループを厳密に最適化する必要がある場合は、純粋な Java にドロップできます。大きな double[] 配列を処理するいくつかのカスタム コードに対してこれを行いましたが、99% の確率で 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 は遅延型であるため、メモリよりも大きなデータ セットを処理するのに適しています (データ セット全体を一度に強制的にメモリに格納しないように注意していることが前提です)。そのような環境で利用できるいくつかの優れたライブラリもあります。最も注目すべきはStormAlephです。Storm は、多数のイベントの分散リアルタイム処理用に設計されているため、特に興味深いかもしれません。

他の言語の経験はあまりありませんが、Haskell と Scala の実際の経験からの私の印象は次のとおりです。

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

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

于 2012-07-23T06:22:58.040 に答える