2009年11月4日水曜日

Haskellのコードを速くするにはどうしたらいいんだろう?


前のエントリでSPHのコードをC++とHaskellとOCamlで書いて比較したんだけど、あまりにHaskell版が遅いなぁ。

C++に対して約15倍も時間がかかってしまう。プロファイラを使ってチューニングしてもこの速度差。せめてC++の3倍くらいで済んで欲しい。

2009/11/5追記:計りなおすと、Haskell版はC++版の約5倍ですんでました。。

どうしたらもっと速くなるんだろう?

正格評価したらいいの?どうやるの?Data.Vectorモジュールには!フラグが付いているんだけど、それじゃだめなの?

ステップの更新を非破壊的にやっているから遅い?けどOCamlはそれでもC++の2倍で済んでるのに。

純粋な科学技術計算だから、どのみちすべての式を計算する必要があるし、その部分では遅延評価のメリットはないよなぁ。だから遅いのかなぁ?けど、ただ計算するだけだから遅延評価も正格評価も関係ないようにも思うんだけど。(遅延評価の方がメモリは使いそうな気がする)

やりたいこととしては、
思考をそのまま落とせるHaskellでプロトタイプを作る→速度の速いC++で書き直す
というフローを組みたいんだけど、それにしても遅すぎる。せめてC++の3倍くらいで済んで欲しいなぁ。あと、Haskellの書きやすさを損なうような方法はとりたくない。(けど、レンダリングの時間も含めて考えたら、シミュレーションは速くても遅くても関係ない、というケースはあるなぁ)

速くするにはどうしたらいいんだろう?何を調べたらいいんだろう?
-

0 件のコメント: