セキュリティ&プログラミングキャンプ2011に参加した

プログラミング言語クラスに参加した。
講義の内容についてはどこかで見られると思うので、個別課題について書く。

個別課題の内容

rubyのpreludeのprecompileという課題に取り組んだ。
preludeというのはインタプリタの起動時に実行されるRubyスクリプトで、内容は

である。

preludeのRubyコードはprelude.cにCの文字列として埋めこまれていて、rubyは起動時に毎回このコードをYARVの命令列にコンパイルして実行している。
preludeの内容は一旦ビルドしてしまえば変わらないので、前もって命令列にコンパイルしておいて(precompile)、インタプリタの起動時にはこれを直接実行すれば高速化が期待できるのではないかと考えた。

結果

prelude.cはrubyのビルドプロセス内でtool/compile_prelude.rbから生成されているので、ここを弄った。
まずはpreludeの内容をcompileしてファイルに書き出しておき、rubyの起動時にそれを読んで実行するという手っ取り早い方法を試したが、これではprecompile無しと比較して6%ほど遅い。

そこで命令列をprelude.cに埋め込んでみたが、これでも3%ほど遅くなってしまった。

考察

prelude.cに命令列を埋め込んでもまだ遅いという事は、コードをcompileするよりも文字列から命令列を得る方がかえって時間がかかるという事を示している。
つまりMarshal.loadでは遅い。
precompileで高速化を狙うには、命令列を高速にloadできるような形式を考える必要がある。

発表

やっている事はシンプルなのに、発表後に「難しい事をされていたんですね」と参加者から言われてしまった。
発表時間が2分しか与えられなかった事を差し引いても、限られた時間で要点を伝える能力の不足を感じた。