ああ疲れた。

展開したら 150 KiB もあるよ。力、入れすぎだね。十数 KiB は Gauche の出力だけどね。二日ぐらいで apply はいじり終える予定だったんだけどね。

っていうか Gauche 便利すぎ。もう他の言語には戻れない…(顔

とりあえずこれで反応待ち。まだ commit しないでね。Reduction とかの interface はまだ改良の余地がありそうだけど、思いつかないから他力本願。

よし、uim.el を見よう。

おっと、その前に performance が落ちてるはずなので、どれぐらいなのか調べてみよう。というわけでシャワー浴びてる間に benchmark を走らせた。左が hack 前、右が hack 後。どっちも -O2 で 5 回ずつ走らせた。結構変更が如実に現れている。

loop とか case とかは速くなっている。case が 5-10%、loop が 20%。これは begin から listp を排除したから。今回の dispatch 自体の変更とはあんまり関係なさそう。

整数処理が 10% ほど遅くなっている。Tight な for loop で回してたのを、関数連続 call に置き換えたのだから当り前。Flag を増やして型チェックを減らすこともできるが、元々分岐予測に優しいパターンなので変わらないような気もする。でも何より apply のバグが取れてるので (あ、テスト書くの忘れてた) 10% なぞ安いもの。でも fibonacci で 16% 低下とかひどいな。

竹内関数 CPS 版では何か怪奇現象が。(顔

で、結論としては、dispatch の速度低下は他の部分の上昇と比べて小さすぎるので測れませんでした、ということで。問題は整数処理。純粋な number crunching の量からすると、fibonacci の 16% というのが一番正確に速度低下を定量してると思う。各関数のコードも、switch が入ったことで肥大化してる。これからはこれを抑えるのが課題。

 ******before******      ******r5rs******

 ****bench-arithint.scm****      ****bench-arithint.scm****

real    0m0.220s        real    0m0.238s
user    0m0.135s        user    0m0.204s
sys     0m0.020s        sys     0m0.022s

real    0m0.159s        real    0m0.173s
user    0m0.138s        user    0m0.158s
sys     0m0.016s        sys     0m0.010s

real    0m0.158s        real    0m0.173s
user    0m0.137s        user    0m0.157s
sys     0m0.015s        sys     0m0.011s

real    0m0.158s        real    0m0.174s
user    0m0.134s        user    0m0.159s
sys     0m0.018s        sys     0m0.009s

real    0m0.157s        real    0m0.173s
user    0m0.141s        user    0m0.159s
sys     0m0.012s        sys     0m0.010s


 ****bench-case.scm****  ****bench-case.scm****

real    0m0.110s        real    0m0.102s
user    0m0.089s        user    0m0.082s
sys     0m0.011s        sys     0m0.009s

real    0m0.104s        real    0m0.096s
user    0m0.083s        user    0m0.080s
sys     0m0.016s        sys     0m0.012s

real    0m0.104s        real    0m0.097s
user    0m0.087s        user    0m0.081s
sys     0m0.012s        sys     0m0.010s

real    0m0.105s        real    0m0.096s
user    0m0.081s        user    0m0.081s
sys     0m0.020s        sys     0m0.011s

real    0m0.104s        real    0m0.096s
user    0m0.086s        user    0m0.082s
sys     0m0.015s        sys     0m0.009s


 ****bench-cpstak.scm****        ****bench-cpstak.scm****

real    0m0.293s        real    0m0.304s
user    0m0.272s        user    0m0.287s
sys     0m0.016s        sys     0m0.012s

real    0m0.287s        real    0m0.298s
user    0m0.275s        user    0m0.286s
sys     0m0.012s        sys     0m0.012s

real    0m0.288s        real    0m0.305s
user    0m0.269s        user    0m0.292s
sys     0m0.018s        sys     0m0.012s

real    0m0.286s        real    0m0.450s ;; あれ?
user    0m0.269s        user    0m0.290s
sys     0m0.017s        sys     0m0.009s

real    0m0.287s        real    0m0.299s
user    0m0.266s        user    0m0.290s
sys     0m0.021s        sys     0m0.009s


 ****bench-fib.scm****   ****bench-fib.scm****

real    0m3.012s        real    0m3.513s
user    0m2.984s        user    0m3.493s
sys     0m0.019s        sys     0m0.010s

real    0m3.006s        real    0m3.509s
user    0m2.983s        user    0m3.489s
sys     0m0.019s        sys     0m0.014s

real    0m2.999s        real    0m3.512s
user    0m2.977s        user    0m3.497s
sys     0m0.016s        sys     0m0.008s

real    0m3.006s        real    0m3.510s
user    0m2.984s        user    0m3.496s
sys     0m0.019s        sys     0m0.009s

real    0m3.005s        real    0m3.513s
user    0m2.988s        user    0m3.499s
sys     0m0.013s        sys     0m0.009s


 ****bench-let-loop.scm****      ****bench-let-loop.scm****

real    0m0.129s        real    0m0.121s
user    0m0.104s        user    0m0.102s
sys     0m0.015s        sys     0m0.010s

real    0m0.124s        real    0m0.115s
user    0m0.103s        user    0m0.100s
sys     0m0.017s        sys     0m0.010s

real    0m0.125s        real    0m0.114s
user    0m0.103s        user    0m0.098s
sys     0m0.017s        sys     0m0.012s

real    0m0.125s        real    0m0.115s
user    0m0.109s        user    0m0.104s
sys     0m0.011s        sys     0m0.007s

real    0m0.124s        real    0m0.115s
user    0m0.108s        user    0m0.097s
sys     0m0.011s        sys     0m0.012s


 ****bench-loop.scm****  ****bench-loop.scm****

real    0m0.078s        real    0m0.063s
user    0m0.055s        user    0m0.040s
sys     0m0.014s        sys     0m0.011s

real    0m0.072s        real    0m0.056s
user    0m0.058s        user    0m0.043s
sys     0m0.009s        sys     0m0.009s

real    0m0.072s        real    0m0.057s
user    0m0.053s        user    0m0.044s
sys     0m0.015s        sys     0m0.007s

real    0m0.072s        real    0m0.057s
user    0m0.053s        user    0m0.045s
sys     0m0.014s        sys     0m0.008s

real    0m0.072s        real    0m0.057s
user    0m0.054s        user    0m0.041s
sys     0m0.013s        sys     0m0.010s


 ****bench-mem.scm****   ****bench-mem.scm****

real    0m0.109s        real    0m0.095s
user    0m0.080s        user    0m0.064s
sys     0m0.022s        sys     0m0.020s

real    0m0.104s        real    0m0.090s
user    0m0.079s        user    0m0.068s
sys     0m0.020s        sys     0m0.018s

real    0m0.105s        real    0m0.090s
user    0m0.082s        user    0m0.069s
sys     0m0.017s        sys     0m0.017s

real    0m0.104s        real    0m0.090s
user    0m0.079s        user    0m0.070s
sys     0m0.020s        sys     0m0.016s

real    0m0.105s        real    0m0.090s
user    0m0.076s        user    0m0.072s
sys     0m0.024s        sys     0m0.012s


 ****bench-rec.scm****   ****bench-rec.scm****

real    0m2.842s        real    0m3.275s
user    0m2.828s        user    0m3.258s
sys     0m0.010s        sys     0m0.011s

real    0m2.836s        real    0m3.258s
user    0m2.826s        user    0m3.245s
sys     0m0.010s        sys     0m0.013s

real    0m2.836s        real    0m3.258s
user    0m2.821s        user    0m3.248s
sys     0m0.016s        sys     0m0.010s

real    0m2.834s        real    0m3.265s
user    0m2.819s        user    0m3.250s
sys     0m0.015s        sys     0m0.016s

real    0m2.838s        real    0m3.264s
user    0m2.822s        user    0m3.255s
sys     0m0.016s        sys     0m0.010s


 ****bench-tak.scm****   ****bench-tak.scm****

real    0m0.207s        real    0m0.215s
user    0m0.193s        user    0m0.200s
sys     0m0.010s        sys     0m0.010s

real    0m0.201s        real    0m0.209s
user    0m0.187s        user    0m0.203s
sys     0m0.014s        sys     0m0.006s

real    0m0.202s        real    0m0.209s
user    0m0.190s        user    0m0.200s
sys     0m0.012s        sys     0m0.008s

real    0m0.202s        real    0m0.209s
user    0m0.185s        user    0m0.201s
sys     0m0.018s        sys     0m0.008s

real    0m0.202s        real    0m0.209s
user    0m0.187s        user    0m0.199s
sys     0m0.015s        sys     0m0.010s


 ****bench-takl.scm****  ****bench-takl.scm****

real    0m1.315s        real    0m1.716s
user    0m1.304s        user    0m1.702s
sys     0m0.007s        sys     0m0.009s

real    0m1.311s        real    0m1.711s
user    0m1.297s        user    0m1.700s
sys     0m0.013s        sys     0m0.010s

real    0m1.314s        real    0m1.707s
user    0m1.296s        user    0m1.695s
sys     0m0.018s        sys     0m0.013s

real    0m1.312s        real    0m1.710s
user    0m1.299s        user    0m1.701s
sys     0m0.013s        sys     0m0.009s

real    0m1.308s        real    0m1.710s
user    0m1.295s        user    0m1.701s
sys     0m0.013s        sys     0m0.008s


 ****bench-takr.scm****  ****bench-takr.scm****

real    0m0.226s        real    0m0.225s
user    0m0.210s        user    0m0.210s
sys     0m0.010s        sys     0m0.009s

real    0m0.221s        real    0m0.220s
user    0m0.205s        user    0m0.208s
sys     0m0.016s        sys     0m0.012s

real    0m0.220s        real    0m0.220s
user    0m0.204s        user    0m0.208s
sys     0m0.017s        sys     0m0.012s

real    0m0.219s        real    0m0.220s
user    0m0.203s        user    0m0.211s
sys     0m0.016s        sys     0m0.009s

real    0m0.221s        real    0m0.219s
user    0m0.205s        user    0m0.206s
sys     0m0.017s        sys     0m0.013s