チューニングメモ

このコードの速度は Ypsilon > Gauche > MoshMosh が一番遅い。

(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 しているから遅い

GaucheMosh の差は 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 を減らす方向でがんばろうかなあ。