そんなのがあって欲しいものがあるんですが、それは何かというと、
iPod用のBOSEです。
BOSEなら音が良さそうだし、レビューも好評価。
思い切って買ってしまおう!
Amazon: BOSE サウンドドック シリーズII デジタルミュージックシステム
-
data Particle = Particle { pos, vel :: {-# UNPACK #-} !Vector3,
mass, rho, prs :: {-# UNPACK #-} !Scalar }のようにします。
output $ take (read (n!!0)) $ simulation ps0の部分です。
[Particles]->[[Particles]]となっていて、粒子の初期状態を引数にとり、各ステップでの粒子の状態をリストで返します。
display $ simulation ps0
for ( int i = 0 ; i < n; i++ )
{
output_particles( p_ps, i );
simulation( p_ps );
}のように、forループの中にシミュレーションと出力を書くことになり、お互いが強く結びついてしまいます。遅延ストリームをなら、このように強く結びつくことを避けられます。open Lazy;;
type 'a stream = Nils
| Cons of 'a * 'a stream lazy_t;;
let rec stream_take (n : int) (s : 'a stream) : 'a stream =
match (n,s) with
| (_,Nils) -> Nils
| (0,Cons(x,_ )) -> Nils
| (n,Cons(x,xs)) -> Cons(x, lazy(stream_take (n-1) (force xs)));;
let rec simulation ps =
let ps' = calc_amount ps (mk_neighbor_map ps) in
let ps'' = advance ps' (mk_neighbor_map ps')
in Cons(ps, lazy(simulation ps''));;
let main =
let n = int_of_string (Sys.argv.(1))
in print_number_of ps0;
stream_output (stream_take n (simulation ps0));;
のように書くことができます。思考をそのまま落とせるHaskellでプロトタイプを作る→速度の速いC++で書き直すというフローを組みたいんだけど、それにしても遅すぎる。せめてC++の3倍くらいで済んで欲しいなぁ。あと、Haskellの書きやすさを損なうような方法はとりたくない。(けど、レンダリングの時間も含めて考えたら、シミュレーションは速くても遅くても関係ない、というケースはあるなぁ)

M-x goto-line 行番号とする。
(global-set-key "\C-x\C-g" 'goto-line)と書いておくと\C-x \C-gで行ジャンプできるのですごく便利。
$ ghc --make -O sph.hs
$ ./sph 300
$ ocamlopt -pp 'camlp4o -parser Camlp4ListComprehension' -o sph sph.ml
$ ./sph 300
$ g++ -O2 -o sph sph.cpp
$ ./sph 300
▼C++
$ time ./sph 30
real 0m6.367s
user 0m4.916s
sys 0m0.157s
▼OCaml
$ time ./sph 30
real 0m11.718s
user 0m9.461s
sys 0m0.241s
→ cppの約2倍
▼Haskell
$ time ./sph 30
real 1m23.961s
user 1m2.786s
sys 0m2.169s
→ cppの約15倍
On PowerBook G4 1.5GHz (Mac OSX 10.4.11)