そんなわけで軽くベンチマークモードを作ってみた。フレームスキップと待ちなんかの時間制御を外して全力で1ステージ分のリプレイを流すだけという簡単なもの。
標準ライブラリのbenchmarkを使おうかと思ったけど、ブロックの中の時間計測しかできず、綺麗にブロックでわけられなかったのであきらめた。
まあ同じようなデータを自分で取ればいいだけだし、それも簡単だったんでいいんだけれども。
1.9.1で動かしてから1.8.7で動かしてびっくり。1.9.1で27秒くらいのところが1.8.7で37秒かかる!fpsも1.9.1で40から50程度出るのに1.8.7で30から40くらいになってるわ。
すげーなこれ。うごいたうごいたてなぐらいしか見てなかったから速度的にそんなに違いがあるとは思ってもなかったけど、だいぶ違うもんだねぇ。
というか1.9はほんとに速くなってるんだねぇ。いや疑ってたわけでは無いんだけど、普段はあんまり速度が実感できるようなもの動かさないじゃん、Rubyで。
これはいいデータが取れたわ。
あとCレベルでのプロファイルも取ったほうがいいのかなと思いついた。メソッド呼び出しにどのくらい時間かかってるか、実はかかってないのかとか知っておきたい。
ちゃんとrubyでやってる最適化を理解して、それにあわせたコードを書くとかも考えたいよね。時間的にコード書くまでいけるか分からないけど。
そういやGCのプロファイルも取ってみた。GC::Profile便利だけど、プロファイラを止めてからではGC::Profile.reportが何も出力してくれないのはちょっとした罠。
思ったよりはGC起きてない感じ。1200から1300フレームくらいはあるシーンだと思うけど、70回くらいかな。いやまあけっこうあるか。いやだいぶあるな。
一回の停止時間は10msから30ms以上。うう、こんなに止まってるのか。しかし結構気づかないもんだな。
最初は10ms程度なのに後の方になるとオブジェクトが増えて停止時間が下手すると30ms越えるんだけど、これメモリリークしてるのかなぁ。使い捨てなオブジェクトは多量にあれど、定期的にGCかかってればそんなにオブジェクトが増えていくようなプログラムじゃないはずなんだけど、どこで余計なオブジェクト抱えちゃってるんだろう。
GCのマークツリーみたいなの表示できたら便利なんだけどなぁ。どっかにないのかな。すげー大量のオブジェクトがあるから見るのも難しいか?
あとオブジェクトちょっと増えると停止時間がめっちゃ増えてる。GCこわい。オブジェクト怖い。
インクリメンタルGCとかできれば描画待ち中とかに裏でちょこちょこGC進めるとかもできるんだけどね。