ああ疲れた。
展開したら 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