Brainf**k インタプリタ最適化
最初に書いたのは、Brainf**kの1命令が、Schemeの関数呼出1回に対応するようなインタプリタだったので、そこに最適化をかけるように変更した。例えば、ポインタが指しているメモリの値を1増やす命令 + は bf-incval に対応していて、++++ は (bf-incval) (bf-incval) (bf-incval) (bf-incval) になっていた。これを、++++ → (bf-incval 4) とまとめればそこそこ高速になるはず。
$ time ./oldscmbf.scm quine.bf > /dev/null real 0m1.615s user 0m1.564s sys 0m0.020s $ time ./oldscmbf.scm quine2.bf > /dev/null real 0m1.068s user 0m1.040s sys 0m0.016s $ time ./scmbf.scm quine.bf > /dev/null real 0m0.763s user 0m0.740s sys 0m0.016s $ time ./scmbf.scm quine2.bf > /dev/null real 0m0.965s user 0m0.928s sys 0m0.016s
プログラム自体が長いquine.bfでは、実行時間が半分になっている。quine2.bfは、プログラム自体が短いため、明白な差は見られなかった。
マンデルブロー集合を書くプログラムは、圧倒的な差がついた。
$ time ./scmbf.scm mandelbrot.bf > /dev/null real 10m21.281s user 9m59.905s sys 0m0.880s $ time ./oldscmbf.scm mandelbrot.bf > /dev/null real 33m8.229s user 31m57.952s sys 0m2.828s