遅延評価

遅延評価というテクニックを使って、PURE RUBY版のVMも速くした。遅延評価とはこんなイメージだ。

ある会社に、膨大な調査が必要な報告書を発注したら、すぐにできたと言って妙に薄い報告書を納品してきた。ヘンだなと思って開くと、ところどころに「この内容を読みたい場合はxxxx-xxxxxに電話してください」と書いてある。電話すると「了解しました、これから調べて届けます」

こんなテクニックは理論上のもので研究以外で使うことないだろと思っていたし、現実にこれを使っているものを見たことはないのだが、今回のamritaの場合は、間違いなく役に立ってると思う。

amritaはHTML→バイトコードの変換の時に、普通使わないバイトコードを大量に作ってしまう。Rubyコンパイルにして実行する時にこの無駄なバイトコードのために、内部で生成するRubyのソースも異常に大きくなっていまい、そのオーバーヘッドでかえって遅くなってしまっていた。そこで以下のように変更した。

lazy_evaluationというフラグをONにすると、コンパイラが異常に速く結果を届けてくる。VMが中をトラバースしてテンプレート展開を実行して行くと、ところどころににProcオブジェクトがある。ヘンだなと思ってcallすると、中の人があわててテンプレートの一部をコンパイルしている。「中の人も大変だな」などと言っている場合ではない、こちらはすでに実行フェーズに入っているのに、今頃コンパイルしているとは何事だ。念のため、隣の枝も見てみるとあっちもこっちもProcだらけで中の人はみんなサボっている。こいつら、みんなあわよくば仕事しないですませる気だな。「コラ、マジメにやれ!」と起こそうとすると、さきほどのProcが結果を出してきたので、しょうがなくそいつらはほっておいて、続きをやる。そうするとその中にもまたProcがあって中の人が・・・

とこんなイメージでやるとみんなが真面目に仕事するよりはやく終わった、という感じである。なんであれ、lazyな方が勤勉な奴に勝つのは気持ちがいい。