[Gauche-devel-jp] letと再帰

Back to archive index

Kimura Fuyuki fuyuk****@nigre*****
2004年 1月 17日 (土) 11:12:33 JST


どうもGaucheのletは場合によっては妙に遅くなることがあるようです。

次の結果を見てください。

0.
$ /usr/bin/time gosh -e '(let l ((n 0)) (or (if (< n 10000) (l (+ n 1))) #f))' -Eexit
        4.71 real         4.63 user         0.06 sys
1.
$ /usr/bin/time gosh -e '(let l ((n 0)) (or #f ((lambda (n) (if (< n 10000) (l (+ n 1)))) n)))' -Eexit
        0.18 real         0.15 user         0.03 sys
2.
$ /usr/bin/time gosh -e '(let l ((n 0)) (or ((lambda (n) (if (< n 10000) (l (+ n 1)))) n) #f))' -Eexit
        4.75 real         4.65 user         0.04 sys
3.
$ /usr/bin/time gosh -e '(let l ((n 0)) (or #f (let ((n n)) (if (< n 10000) (l (+ n 1))))))' -Eexit
        0.16 real         0.14 user         0.01 sys
4.
$ /usr/bin/time gosh -e '(let l ((n 0)) (or (let ((n n)) (if (< n 10000) (l (+ n 1)))) #f))' -Eexit
       17.29 real        17.16 user         0.03 sys

1と2の差はしょうがないと思います。が、2と4の差は納得がいきません。実際、
これだと組み込みのletより

http://sourceforge.net/mailarchive/message.php?msg_id=3794302

のlet*マクロに展開してもらったほうが速いというおかしなことになってしま
います。

ちなみに、0をいろいろな処理系で実行してみると、得意不得意がはっきり出
ておもしろいです。インタプリタではSCMが最速かな? …とかやってたら、
gosh はsiscよりも遅いことに気づいてしまった。うーむ。

-- 
木村 冬樹



Gauche-devel-jp メーリングリストの案内
Back to archive index