Haskell / Clojureは、実際には粒子シミュレーションなどの動的システムには適していませんか?


9

以前の質問で、関数型プログラミング言語は物理エンジンなどの動的システムには適していないと言われています。これは、主にオブジェクトの変更にコストがかかるためです。このステートメントはどの程度現実的ですか、そしてその理由は何ですか


4
github.com/linneman/particles-cljが興味深いかもしれません。Due to the functional programming style the computational load will be distributed over the available CPU cores which can dramatically increase processing speed in some cases

2
彼らは彼らが不適当だと誰が言ったのですか?回答/コメントへのリンク?
Andres F.

7
@Dokkat:非常に正直に言うと、私はそこでのコメンターが関数型プログラミングについて多くのことを知っていることに懐疑的です。大粒の塩と一緒に服用します。
CAマッキャン

6
さらに、作者が実際に関数型プログラムを書いてみたことが証明されない限り、「純粋な関数型のアプローチはゲームに適していません...」で始まる答えも無視します。それ以外の場合、彼は問題何であると考えているかを推測しているだけです。
アンドレスF.

1
@Dokkatゲーム開発には、パーティクルシミュレータと物理エンジン(関数プログラミングにかなりうまく適合できる)だけでなく、追加の制約があります-ランタイムパフォーマンスは、ゲーム開発の鍵となります(時には物理自体よりも重要です)。爆発を予測する鉱山会社の物理エンジンは、パフォーマンスよりも正確さを求めます。関数型プログラミングでは、より多くのハードウェアを投入することでより簡単にパフォーマンスを得ることができます(ゲームエンジンでは実行できないもの)。

回答:


10

HaskellとClojureはどちらも実際の可変性を許可しているため、そもそも問題ではありません。

さらに、「可変」データが、より大きな計算の一部として段階的に更新される中間値で構成されている場合、効率を上げるために可変性を必要としないこともあります。たとえば、Haskell では、ストリームフュージョンと呼ばれる手法に関して進行中の研究があります。これは、コンパイラが処理ループ、データプロデューサー、およびデータコンシューマーを融合して、中間データ構造を完全に排除するものです。

ここでのHaskellの主な問題は、怠惰です-大量の入力データと大量の出力データがあり、そのすべてが重要である数値計算プログラムでは、遅延は非常に少ない利点ですが、それでもオーバーヘッドを課します。Haskellでそのようなプログラムを書くことができないと言っているわけではありません(実際、人々はそうしています)が、それは言語の強みを生かしておらず、必要なパフォーマンスを得るために評価モデルをよりよく理解する必要があります。

そうは言っても、JVMの強みに対しては、大量の処理は機能しません。そのようなプログラムが、FORTRANがまだ存在する理由です。


1
注意が必要です。次のGHCバージョン8.0では、モジュールごとに厳密な評価モードがサポートされます。
Erik Kaplun、2015年

8

Clojureについて話すことはできませんが、Haskellには非常に高度に調整されたIOパッケージが多数あり、必要なすべての変更が可能です。

ここに私が書いた質問への回答があります。誰かが最も一般的な3つの詳細を説明し、そのパフォーマンスを考慮します。https//stackoverflow.com/questions/15439966/when-why-use-an-mvar-over-a-tvar/15440286 #15440286

また、ここでは、IOを集中的に使用するアプリケーションであるWarpと呼ばれるHaskell Webサーバーのパフォーマンスメトリックを示す簡単なグラフも確認できます。

Haskellに関してはこれについて多くの混乱がありますが、実際には、IOをさまざまな方法で使用するためのハッキングに関する多くのパッケージを備えた素晴らしいIO機能があり、その多くは高度に調整されています。これが当てはまらないと人々が推測する理由は、HaskellがIOを他のすべてのものから分離するために非常に長い時間を費やしているためですが、それはパフォーマンス特性に影響を与えません。

ただし、パフォーマンス特性について説明すると、パフォーマンスが悪いと人々が認識するのは、遅延評価が原因で常に直感的とは限らない方法で動作するためです。ただし、これは、参照しているシステムなどの破壊的な更新を行うIOコンテキストで作業を開始するときに、それほど心配する必要のないものです。さらに、パフォーマンスの問題が発生すると、組み込みの機能を使用して、リソースの配置先を特定し、特定することで、多くの人が大きな助けになることに気づく傾向があります。

あなたが説明しているようなシステムを検討する価値のあるもう1つのモナドは、非常に小さなIO呼び出しによって行われる破壊的な更新のために特に優れたパフォーマンスを発揮するSTモナドです。

申し訳ありませんが、Clojureとは会話できません。詳細を教えていただければ幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.