Webサイトのバックエンドシステムを記述したいと思います(カスタム検索スタイルのサービスになります)。高度な並行性と高速性が必要です。同時実行性を希望して、HaskellやScalaなどの関数型言語を使用することを計画していました。
ただし、速度も優先事項です。 http://benchmarksgame.alioth.debian.org 結果はJavaがC/C++とほぼ同じ速さであり、Scalaは一般的にかなり良いことを示しているようです、しかしHaskellの範囲は、ほとんどのタスクで遅くなります。
高度な並行タスクを実行するためにHaskell vs Scala vs Javaを使用したパフォーマンスベンチマーク/経験はありますか?
私が見たいくつかのサイトは、Scalaにメモリリークがあることを示唆しています。これは、このような長時間実行されているサービスではひどいものになる可能性があります。
サービスをどのように記述すべきか、または選択する前に何を考慮すべきですか(パフォーマンスと同時実行性が最優先事項です)?
ありがとう
この質問は、表面的にはGHCでコンパイルされたコードとJVMで実行されているコードのパフォーマンスに関するものです。しかし、他にも多くの要因が関係しています。
人
動作
コミュニティ
ツール
あなたが考慮すべき100万と他の1つの要因があります。 Scala、Java、Haskellのいずれを選択した場合でも、パフォーマンス要件を満たすことができることをほぼ保証できます(つまり、これらの言語のパフォーマンス要件を満たすためには、おそらくほぼ同じ量のインテリジェンスが必要です)。 Haskellコミュニティは悪名高い助けであり、Scalaコミュニティでの私の限られた経験はHaskellとほとんど同じです。私は個人的にJava少なくともファーストクラスの機能を備えた言語と比較すると、気の毒です。また、より多くのJavaプログラマーが世に出ており、Javaに関するインターネット上の情報の拡散を引き起こしています。あなたが知る必要があるのはそこにあります)またはもっと悪いです(ふるいにかける多くのノイズ)。
tl; drパフォーマンスはほぼ同じだと思います。他の基準を検討してください。
あなたはあなたが最もよく知っていて、あなたが達成しようとしていることに対して最高のライブラリサポートを持っている言語を選ぶべきです(ScalaはJavaライブラリを使用できることに注意してください) )Haskellは、Scalaでも同じように効率的に使用するのに十分習得していれば、ニーズに適している可能性が非常に高くなります。言語を十分に理解していない場合、高性能のコードを作成するのは困難です。
私の観察では、適度に速く書き込めるandよりコンパクトな高性能並列コードをScala Haskellよりも簡単に記述できます。ただし、どちらの言語でも注意してください。
Scalaにはアクター関連のメモリリークはもうありませんexcept CPUが制限されているためにメッセージが消費されるよりも速く作成される場合、またはデフォルトのアクターを使用する場合すべてのメッセージを処理することを忘れます。これはバグではなく設計上の選択ですが、特定の種類のフォールトトレラントアプリケーションに対しては、間違った設計上の選択になる可能性があります。 Akkaは、アクターの異なる実装を使用してこれらの問題を克服します。
接戦の比較を見てください。一部の問題については、ghcとJava7サーバーが非常に近いです。同様に多くの場合、2倍の違いがあり、1つだけの場合は5倍の違いがあります。その問題は、stdlibには適切なものがないため、GHCバージョンが手作業で変更可能なハッシュテーブルを使用するkヌクレオチドです。新しいデータ構造のいくつかは、今よりも優れたハッシュテーブルを提供することを望んでいます。
いずれにせよ、問題が最初の一連の問題(純粋な計算)に近い場合、パフォーマンスに大きな違いはなく、2番目の問題(通常、ミューテーションを本質的に使用する)に近い場合、ミューテーションでもおそらく気付くでしょう多少のパフォーマンスの違い。
しかし、再び、それは本当にあなたが何をしているかに依存します。大きなデータセットを検索している場合、IOバインドされる傾向があります。不変構造のトラバーサルを最適化している場合は、haskellで問題ありません。変更している場合複雑な構造の場合、(依存する)多少の支払いが必要になる場合があります。
さらに、GHCの軽量なグリーンスレッドは、特定の種類のサーバーアプリケーションを非常に効率的にすることができます。したがって、サービング/切り替え自体がボトルネックになる傾向がある場合、GHCは問題を抱えている可能性があります。
速度は問題ありませんが、実際の違いは、コンパイルされた言語とスクリプト言語を使用することです。それを超えて、特定のHPC状況でのみ、私たちが話している種類の違い本当にが重要になります。
シュートアウトベンチマークは、すべての実装で同じアルゴリズムが使用されることを前提としています。これは、C/C++(ほとんどの場合、リファレンス実装です)およびそのような言語に最も有利です。別の言語に適した別のアプローチを使用した場合、これは失格となります。
Haskellでより自然に記述された問題から始めると、その言語(またはそれに非常によく似た言語)で最もよく機能します
多くの場合、同時実行性の使用について話をするとき、彼らがしている理由を忘れてしまうのは、アプリケーションを高速化するためです。複数のスレッドを使用してもそれほど速くも遅くもない多くの例があります。私は、あなたができるようにプロファイル/調整された効率的なシングルスレッドの実装から始め、次に何が同時に実行できるかを検討します。これより高速ではない場合は、複数のCPUを使用しないでください。
私見:パフォーマンスはあなたの最優先事項(正当性の背後にあります)であり、並行性は宿題の練習においてのみ優先事項です。
私はScalaと言いますが、Scalaを試してみたので、私の好みは間違いなくScalaです。とにかく、Javaで書かれた高性能のマルチスレッドアプリケーションがかなりたくさんあるので、アプリケーションのこの性質がなぜFPへの移行を義務付けているのかはわかりません。scalaとhaskellの両方でアプリケーションが必要とするパフォーマンスに基づいて非常に小さなモジュールを作成し、パフォーマンスを測定することをお勧めします選択した言語の他の機能のメリットを検討しているのでなければ、Javaを使い続けたいと思うかもしれません。
Haskell vs Scala vs Java=高度な並行タスクを実行するために使用することのパフォーマンスベンチマーク/経験がありますか?
特定のソリューションアーキテクチャが重要です- 非常に重要です 。