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 に慣れてる人も、他の言語で書かれたアルゴリズムを移植する際とかには、気を付けたいですね。