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よりも遅いことに気づいてしまった。うーむ。 -- 木村 冬樹