2013-03-06 3 views
8

私は主題に関する決定的な情報を見つけられないようです。そこにはたくさんのハスケルのゲームの実装がありますが、私が見つけたものは小さなゲームであり、そのアプローチが拡大するかどうかは不明です。同様に、Haskellプログラム(主に国家モナドを使用)に州があることに関する多くの情報がありますが、そのような方法の効率性は命令型言語の状態に匹敵するかどうかについてはほとんどありません。非常にステートフルなゲーム/シミュレーションのために、Haskellの状態をC++と比較すると効率的ですか?

非常にシンプルなグラフィックを持つシミュレータに取り組んでいます。これはHaskellでの開発を非常に望ましいものにしてくれます。しかし、可能な限り多くのエンティティをシミュレートしたいので、効率が非常に重要です。私はHaskellを使うために小さなパフォーマンスの低下を受け入れるだろうが、このシミュレーションのステートフルな性質がハスケルのコードを私の他の選択肢C++よりも遅くするように心配している。

タイトルが述べるように、Haskellはどのようにこのタイプのアプリケーションを比較しますか?実装されたステートフルな高性能Haskellプログラムへのリンクに加えて、Haskellでの使用方法の提案は非常に高く評価されます。

私が状態を維持する必要があるより具体的な例が必要な場合、私はそれを提供することができますが、各反復で広範囲に変化する座標の膨大なコレクションを考えれば十分です。

ありがとうございます!

+3

それは立っているとしての質問は広すぎます。おそらく問題と思われるものの具体例が必要です。 –

+0

@DonStewart問題は、ベンチマークをまとめるために、ハスケルが私がやりたいことにぴったり合っていることを確認することに関するものでした。あいまいさには申し訳ありません!あなたの答えはハスケルにこれを撃つことで私を売ってしまったので、将来的にはもっと具体的な質問で私は戻ってくるだろう。 – trolox

答えて

11

あなたの質問に直接答えることはできません。

TL; DR:パフォーマンスの問題が発生する理論的な理由はありません。そして確かに、「大きさの桁違い」のパフォーマンスが悪い理由は分かりません。ただし、具体的なシナリオがない限り、幅広いステートメント以外は作成するのが難しいです。


ハスケルは、C++と同様に、ベアメモリとシャッフルビットにアクセスできます。それで、心配する理論的な「大きさの遅さ」はありません。確かに、もしあなたがメモリの変化しやすい塊として状態を表現したい、あるいは割り当てられたフレームをスタックすることを望むなら、Haskell(GHC実装)はこれをサポートしています - 結局、Haskellで書かれたオペレーティングシステムがあります。

この分野において有用ないくつかのイディオムとライブラリ:

  • 箱なし、厳格なフィールド
  • STモナド(生のメモリへの安全なアクセス)
  • ベクトルとREPAライブラリ - ハイパフォーマンスベクトル

ほとんどの場合、デバイスドライバをプログラミングしていない限り、絶対レベルの低い制御は必要ありません。

あなたのアルゴリズムが分かりやすい限り、あなたはうまくいくでしょう。

HaskellのGHC実装では、不変のデータを安価にする非常に高速な割り当て(バンプポインタ)があります。不変のデータを使用することには、固有のペナルティはなく、より簡単な並列化と、保守が容易なコードが得られます。そうすれば、ハスケルのイディオムを守ることができます。

可能な限り多くのエンティティをシミュレートしたいと考えています。つまり、効率は非常に重要です。

GHCは非常に効率的な割り当てとガベージコレクタがあり、オブジェクトが安価であり、低オーバーヘッドを持っている - あなたは賢明なデータ表現を使用すると仮定すると - ので、私はここでは問題を見ていません。例えば。ベンチマーク・ゲームでは、バイナリ・ツリー・ベンチマークは、このマイクロテスト用の書き込み時にアロケータ・パフォーマンス-をテストします。

最終的には、基本的にハスケルを使用するペナルティーはありません。必要に応じて命令型アルゴリズムを使用することができます。おそらく必要はありません。単純なアルゴリズム(可変配列の代わりに不変なリストを使うなど)を使うのは間違いではありません。これははるかに大きなリスクです。新しいユーザーとして、非効率的なアプローチを使用する可能性があります。ヘルプとプロファイルを依頼してください。

10年前の新しいHaskellユーザーは、Frag許容できる性能。 GHCは今でももっと賢いです...

+0

私のあいまいな質問にもかかわらず、すばらしい返答をありがとう。いくつかのフォローアップ:1.不変データを使用することに固有のペナルティはない、つまり、大きな不変データ構造の1つの値を更新することは、単純な破壊的更新と同じくらい効率的であるということを意味しますか? 2.私はGHCの「すべてを止める」ガーベジコレクターが時折フレームを落とすことによって問題になっていることを読んだ。これは有効な懸念事項ですか?ありがとう! – trolox

+0

不変構造の値を更新すると、 "類似の"一時的/変更可能な構造よりもコストがかかる可能性があります。私の主張は、それが問題であれば、可変構造を使うことができるということです。私は世界を止めることに問題は見られず、GHCはいくつかの高頻度取引プラットフォームに使われているので、それは私の最大の関心事ではありません。 –

+0

私は素朴なデザインを心配しています。たとえば、可変配列の代わりに不変のリストを使用しています。これはひどい複雑さを伴います。同様のアルゴリズムと同様のデータ型を使用すると、同様のパフォーマンスが得られます。 –

関連する問題