チューニングメモ
このコードの速度は Ypsilon > Gauche > Mosh と Mosh が一番遅い。
(let loop ([i 0]) (if (= i 10000000) '() (begin (+ i 1.0) (loop (+ i 1)))))
違いは恐らく Flonum の allocation と GC のコストであると推測。
- Ypsilon は GC が並列に動いているので速い
- もしくは副作用がない式を消しているか。
- Gauche は Flonum をスタックに取る最適化をしているから速い(0.8.14 には入っていたはず)
- Mosh は素直に GC_malloc しているから遅い
Gauche と Mosh の差は GC_PRINT_STATS すると HEAP サイズの違いで明らかに分かる。
とりあえず GC が並行に動くのはうれしい気がするので Boehm GC の以下のオプションを試してみた。
--enable-threads=posix --enable-parallel-mark
./mosh -5 work.scm 2.19s user 0.00s system 109% cpu 1.996 total
109% ってことは GC は別スレッドになったのかな。とりあえず速くはならなかったので元に戻そう。(markが parallel になるだけかも。ドキュメント読もう)
allocation を減らす方向でがんばろうかなあ。