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