2007/07/20

Rubyist Magazine - YARV Maniacs 【第 3 回】 命令ディスパッチの高速化

C言語でVMのディスパッチャを書く際の高速化技法。主にswitch/caseやジャンプテーブルとかアドレス直埋め込みとか。

Rubyist Magazine - YARV Maniacs 【第 3 回】 命令ディスパッチの高速化

昔々FORTHコンパイラで遊んでいたころを思い出した。FORTHコンパイラのコードは今のVMのアセンブラのようなもの。まさにこのスレディッドコードと相性がよい、というかそのままなのだ。だからシンプルで高速だった。

もう少し突っ込むと、各オペランドの処理がインラインで展開できるなら一番いいのだが、出来ないとしたら、例えば関数コールの戻り先をループの先頭にしちゃうとか、PCの変化が予測可能なら次の命令のアドレスにしちゃうとか。

実際メンテナンスにも作るのにも最低だが、良く考えられた大きな関数1つてのがざっくりいって最も効率が高い。だからそれに近いイメージのコードを生成させるのがコンパイラ使いに必要。正直loopなんて無駄なのだ。あと最近ではキャッシュとかパイプライン、分岐予測を考慮に入れないと、ほんとに速いコードは書けない。まあ実際にはしないけど笑

最近では組込み分野でもかなりお富豪なプログラムを平気で書く若い子が増えている。ロジックを追っかけるので精一杯で、効率には頭が回らないんだろう。この文をかいている人は学生さんのようだ。是非エンベデッドな世界に来てください笑