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 の呼び出しが減る

はずだけどコンシングの数はどうやって見ればいいのだろう。