Chicken Schemeのトップレベル定義と内部定義の最適化の違い

検証

fibの速度比較の記事を見て、ふと気になりましたので、
お気に入りの処理系Chicken Schemeで下記のテストを行ってみました。

(declare
  (unsafe)
  (fixnum-arithmetic))

(define (fib* n)
  (if (< n 2)
      n
      (+ (fib* (- n 1))
         (fib* (- n 2)))))

(time
  (begin
    (display (fib* 40))
    (newline)))

(define (fib** n)
  (define (fib** n)
    (if (< n 2)
        n
        (+ (fib** (- n 1))
           (fib** (- n 2)))))
  (fib** n))

(time
  (begin
    (display (fib** 40))
    (newline)))

コンパイルオプション:

csc test.scm -O2

実行結果:

102334155
6.2s CPU time, 0.026s GC time (major), 61/40496 GCs (major/minor)
102334155
0.912s CPU time

ちなみに最適化オプションがなかった場合、
fib* と fib** は実行速度にほとんど差がありませんでした。

結論

Chicken Schemeでは内部定義は最適化オプションで
処理が展開される可能性が高いと思われる。

または、単純にトップレベル定義の呼び出しのオーバーヘッドが大きいので
避けたほうがよいのかもしれない。