fib 深追い - Scheme VM を書く

fib(30)だとログが膨大になるので fib(26) にした。
コンパイルと eval の傾向は fib(30) と変わらないことは確認済み。

コード

(define (fib n)
  (if (<= n 2) 1
      (+ (fib (- n 1)) (fib (- n 2)))))
(write (fib 26))
(display "  :")

結果

REFER_GLOBAL_TOP_LEVEL_APPLY は APPLY に FALLTHROUGH しているので注意。
データに誤りがあったので再計測しました。

(instruction total時間 回数 average時間)
(PUSH 745018 613524 1.2143257639472946)
(CONSTANT 734922 608287 1.2081829794159664)
(REFER_LOCAL0 306515 245507 1.2484980061668303)
(APPLY 306381 244185 1.2547085201793722)
(REFER_GLOBAL_TOP_LEVEL_APPLY 305292 243328 1.2546521567596003)
(FRAME 302054 243351 1.2412276916881377)
(BRANCH_NUMBER_LE 298071 242785 1.2277158803056203)
(RETURN 298025 243350 1.2246763920279433)
(REFER_LOCAL0_PUSH 296815 244050 1.2162056955541898)
(NUMBER_SUB 294243 242789 1.211928876514175)
(NUMBER_ADD 149203 121927 1.2237076283349873)
(LOCAL_JMP 148007 121636 1.2168025913380907)
(REFER_FREE 4565 3580 1.2751396648044693)
(REFER_LOCAL1 2442 1985 1.2302267002518892)
(CONSTANT_PUSH 2028 1500 1.352)
(SHIFT 1059 843 1.2562277580071175)
(BRANCH_EQ 1053 846 1.2446808510638299)
(CLOSURE 1010 649 1.5562403697996918)
(REFER_FREE_PUSH 965 754 1.279840848806366)
(DISPLAY 922 611 1.5090016366612111)
(BRANCH_NULLP 846 671 1.2608047690014903)
(VECTOR_SET 827 587 1.4088586030664396)
(INDIRECT 805 648 1.242283950617284)
(LET_FRAME 797 626 1.2731629392971247)
(ENTER 791 626 1.2635782747603834)
(CDR_PUSH 789 609 1.2955665024630543)
(REFER_GLOBAL_TOP_LEVEL 738 526 1.403041825095057)
(UNDEF 650 492 1.3211382113821137)
(VECTOR_REF 628 502 1.250996015936255)
(DEFINE_GLOBAL 609 280 2.175)
(REFER_LOCAL 587 444 1.322072072072072)
(CAR_PUSH 578 416 1.3894230769230769)
(APPEND 569 51 11.156862745098039)
(LEAVE 500 390 1.2820512820512822)
(BOX 474 359 1.3203342618384402)
(ASSIGN_LOCAL 443 359 1.233983286908078)
(TEST 442 361 1.2243767313019391)
(REFER_LOCAL2 427 333 1.2822822822822824)
(BRANCH_NUMBER_EQUAL 389 317 1.227129337539432)
(REFER_LOCAL1_PUSH 358 274 1.3065693430656935)
(CONS 299 194 1.541237113402062)
(REFER_LOCAL_PUSH 184 155 1.1870967741935483)
(MAKE_VECTOR 182 110 1.6545454545454545)
(CAR 120 91 1.3186813186813187)
(NULL_P 86 74 1.162162162162162)
(BRANCH_PAIRP 86 60 1.4333333333333333)
(NOT 84 68 1.2352941176470589)
(CDR 81 63 1.2857142857142858)
(VECTOR_P 78 63 1.2380952380952381)
(REFER_LOCAL2_PUSH 41 31 1.3225806451612903)
(SYMBOL_P 31 24 1.2916666666666667)
(APPLY2 28 17 1.6470588235294117)
(CADR_PUSH 27 19 1.4210526315789473)
(EQ 26 23 1.1304347826086956)
(PAIR_P 13 9 1.4444444444444444)
(NUMBER_EQUAL 9 7 1.2857142857142858)
(REFER_GLOBAL 7 3 2.3333333333333335)
(CDDR_PUSH 7 4 1.75)
(CADR 6 3 2.0)
(CDDR 4 2 2.0)
(VECTOR_LENGTH 3 3 1.0)
(BRANCH_NUMBER_GT 2 2 1.0)
(NUMBER_GT 1 1 1.0)

今日はここまで。おやすみなさい。