open-mgl-dev (開発バージョン) (0.7.9.80) | 2009-11-02 22:25 |
open-mgl (DirectX9, VC++2008) (0.7.9) | 2009-09-27 20:32 |
roast-dev (開発バージョン) (0.0.1.40-dev) | 2009-11-02 23:09 |
※少なくともVC++2008の場合。
VC++のコンパイラは結構頭が良い。こんな最適化だってあった。
if elseにしたって、switch文と同性能のコードがされるんだろう・・・と思っていたら、実はそうではなかったようで・・・。
switch文の場合はジャンプテーブルで作成される。アセンブラコードで見ると
jmp dword ptr (4012A4h)[ecx*4]
みたいな風になっている。ecxにはswitch文として指定した数値が入っていて、このアセンブルコードならば 4012A4h にジャンプテーブルが置いてある。ecxに*4しているのは、テーブルに書いてあるアドレスの一つが4バイト(32bit)であるため。後はそのジャンプテーブルのアドレスにジャンプすれば良い。ワンステップ。すごく速い。
一方、if elseの羅列の場合、律義にジャンプテーブルも使わず、一つづつチェックしているようで・・・。
例えジャンプテーブルに変換可能なようなif else文であってもそこまで見てはくれないらしい・・・。当然遅い。
と言う事で、コンパイラが結構頭良くなって来た今の時代でも、こう言った奴は未だにswitch文で書いてあげた方がいいようです。