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)
今日はここまで。おやすみなさい。