Tuesday 15 December 2015

switch 文のコンパイル

昔、書いたことがあるんだけど、かなり面倒くさいです。

caseの値を集めて、チャンクを作って、それが連続あるいは倍数の連続が多いかどうかを判断して、可能ならテーブルjumpにする。そうでなれば、2分探索にする。あるいは、その組み合わせですね。表の密度が低かった時に、どの程度まで表にするかを判断するのは微妙。しかも速くなるとは限らないし。

どうせ、

* 80%の呼び出しは、20%以内のcase文になる

わけなので、表にして「常に同じコストを掛ける」のが良いかと言われるとね。

その部分を前もってif文で別に書いておくのも悪くないが、byte code interpreterとかだと、

* どこが良く使われるかはベンチマークあるいはアプリ次第

つまり、「プログラマの効率化に関する予想は常にハズレる」というあれだな。

この手の話はTiny BasicやGame Interpreterの時代からあって、ちょっと工夫するとベンチマークは速くなるんだけど、実際のプログラムだとあまり差が出ないとかの結果になっていたな。

で、まだ、その話やってるのね。ご苦労様です。

No comments: