レイトレースベンチを Squeak Smalltalk で


Matzにっき航海日誌 - 動的言語対静的言語(ただしGroovy対Scala) で取り上げられていた coding, by Derek Young: Scala vs. Groovy: static typing is key to performance 経由で。


Squeak Smalltalk だとどの程度の結果が出るのか興味があったので、ミニマルオプティマイズの ray.java を参考に移植。


次の式を評価することで画像の出力(image.pgm)と計測ができます。

[RayBench pixelSize: 256 level: 9] timeToRun milliSeconds

http://squab.no-ip.com/collab/uploads/61/image.png


1.0 GHz PowerPC (OS X) で約 30 分でした。ちなみに同じ条件(縦横 256 ピクセル、9レベル)で ray.java だと約 30 秒。かなり差をつけられてしまっていますが、心配していたほどは遅くはなくて一安心…といったところでしょうか。VisualWorks(Cincom Smalltalk)との性能比も見てみたいですね。



追記

Vec の #+、#-、#* やコンストラクタの定義を端折るのに Array を継承させたのはどうやら失敗だったようで、ふつうに Object 下に定義しなおした(Vec1)ら、ただそれだけであっさり 13 分強まで短縮されました。orz

それとは別に FloatArray というのを見つけて Array の代わりに継承してみた(Vec2)ところ爆速。こ、これはっ!と一瞬、色めき立ったのですが、残念ながらこいつは名前通り float の精度でしか演算しないため、double の精度が出ず、きちんと描画されませんでした。がっかり。


RayBench class の #vecClass を書き換えることでベクターに使用するクラスを切り替えて試せるようにしてあります。