profile
fib のプロファイルを最適化なしで取ってみた。
プロファイル無しだと 0.03 sec vs 11.5 sec(プロファイル付きで0.07 sec vs 14.25 sec) か。
いろいろ試しでもしないと速くなる気がしない。
gosh> (with-profiler (letrec ((fib (lambda (n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))))) (fib 20))) Profiler statistics (total 7 samples, 0.07 seconds) num time/ total Name calls call(ms) samples ---------------------------------------------------+------+-------+----------- fib 21891 0.0018 4( 57%) - 21890 0.0009 2( 29%) < 21891 0.0005 1( 14%) + 10945 0.0000 0( 0%) undefined? 3 0.0000 0( 0%) not 1 0.0000 0( 0%) profiler-raw-result 1 0.0000 0( 0%) profiler-show 1 0.0000 0( 0%) (profiler-show loop101) 1 0.0000 0( 0%) null? 1 0.0000 0( 0%) profiler-get-result 1 0.0000 0( 0%) 6765 #<undef> gosh> (let1 c (compile () '(letrec ((fib (lambda (n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))))) (fib 20))) (with-profiler (secd 's 'e c 'd))) Profiler statistics (total 1425 samples, 14.25 seconds) num time/ total Name calls call(ms) samples ---------------------------------------------------+------+-------+----------- secd 306480 0.0341 1045( 73%) equal? 2046875 0.0004 79( 6%) caaddr 1915523 0.0003 54( 4%) pair? 2211034 0.0002 44( 3%) cdaddr 788083 0.0003 21( 1%) cons 306481 0.0006 18( 1%) cadddr 481614 0.0004 17( 1%) locate 76618 0.0016 12( 1%) car 514450 0.0002 10( 1%) caddr 328373 0.0003 10( 1%) cdar 284587 0.0004 10( 1%) (secd #f) 76618 0.0013 10( 1%) (secd G179) 21891 0.0046 10( 1%) cddr 350263 0.0003 9( 1%) cdr 492557 0.0002 8( 1%) cdddr 328372 0.0002 8( 1%) cddddr 306480 0.0003 8( 1%) - 175126 0.0003 6( 0%) null? 306481 0.0002 5( 0%) caar 295534 0.0002 5( 0%) cadar 120402 0.0004 5( 0%) (secd #f) 43782 0.0011 5( 0%) cadr 350263 0.0001 4( 0%) list 328373 0.0001 4( 0%) list-ref 153236 0.0003 4( 0%) (secd #f) 21890 0.0018 4( 0%) cddar 98510 0.0003 3( 0%) (secd #f) 21892 0.0009 2( 0%) (secd G180) 21892 0.0009 2( 0%) caaar 21892 0.0005 1( 0%) (secd #f) 21891 0.0005 1( 0%) (secd G175) 10945 0.0009 1( 0%) (secd #f) 21892 0.0000 0( 0%) append 21892 0.0000 0( 0%) cdaar 21892 0.0000 0( 0%) < 21891 0.0000 0( 0%) (secd G177) 21891 0.0000 0( 0%) (secd G176) 10946 0.0000 0( 0%) + 10945 0.0000 0( 0%) (secd #f) 10945 0.0000 0( 0%) undefined? 3 0.0000 0( 0%) (secd G178) 2 0.0000 0( 0%) profiler-show 1 0.0000 0( 0%) (secd G181) 1 0.0000 0( 0%) (secd G182) 1 0.0000 0( 0%) gensym 1 0.0000 0( 0%) (secd G186) 1 0.0000 0( 0%) (profiler-show loop101) 1 0.0000 0( 0%) values 1 0.0000 0( 0%) profiler-get-result 1 0.0000 0( 0%) ((6765 . s) e () d) #<undef>
末尾再帰用に TAPC や SELR を使うと、
- コンシングが減る
- 命令の数が減る => secd の呼び出しが減る
はずだけどコンシングの数はどうやって見ればいいのだろう。