MiniLight renderer: OCaml で raytracer を書いたら C++ より早くなりました、という話

MiniLight renderer cleanup, simpler (safer) code is faster

MiniLight という簡単な global illumination renderer は、そのアルゴリズムC++OCaml を始め、7種類の言語で実装されています。そのコード行数と速度を比較。その OCaml での実装が幾つか OCaml らしくなかったので、より簡潔に書き直したらなんと C++ より早くなったというお話。もちろん C++ 版が十分に最適化されているわけではないし、 OCaml版も綺麗にした以外は同様なので、言語間の正確な比較ではありませんので C++厨は釣られない、釣られない。
我々が注目すべきは OCaml でのスピードアップ要因です: 元の OCaml ソースは(おそらく) C++ からの実直な移植、もしくは C++ と同様の実装だったため、

  • if 文を多用
  • 'a option が使える所を bool * 'a を使用

していたのですが、それをパターンマッチと option を使っただけで、ソースがより短く、読みやすくなった上に、早くなったそうです。(実際の例は元の記事を見てください。*1 ) OCaml のパターンマッチコンパイラは偉いですね。

パターンマッチのない言語から、 OCaml に移ってきた方は、意識してパターンマッチを使うようにすると、より良く、早いコードが書けるかもしれません。OCaml に慣れてる人も、他の言語で書かれたアルゴリズムを移植する際とかには、気を付けたいですね。

*1:一言でいうと、パターンマッチと == で書ける所をわざわざ block 作った上に = を使っていたらしい。パターンマッチコンパイラが偉い以前の問題だー。