計測計測 - Scheme VM を書く

目に留まること

  • PUSH,CONSTANT,APPLY,REFER_FREE,REFER_LOCAL0 が多い
  • DISPLAY 重い
  • APPLY 重め
  • 繰り返しで多いもの
    • 引数を参照して次の手続きの引数として PUSH
    • 引数としてPUSHしたものをすぐに参照
  • 当たり前だけど PUSH が多い
  • 回数は少ないが BOX が重い
  • REFER_FREE <=> PUSH

./match.scm

(match '(1 2 3 45)
  ['(a b c . d)
   (print a)
   ]
  [else
   (print 'unmatch)])
(PUSH 9943496 6414238 1.5502224894056005)
(REFER_LOCAL0 4976334 3248079 1.5320852725564864)
(REFER_FREE 4676484 2987085 1.5655677692466066)
(APPLY 3283426 1814007 1.810040424320303)
(REFER_LOCAL1 2981772 1852382 1.6096960562130274)
(CONSTANT 2875079 1837342 1.5648033953395721)
(REFER_GLOBAL_TOP_LEVEL 1955175 1108414 1.7639392862233787)
(REFER_LOCAL0_PUSH 1849696 1141628 1.6202265536584597)
(BRANCH_NUMBER_EQUAL 1600084 991181 1.6143206942021688)
(FRAME 1563970 980596 1.5949177846942064)
(RETURN 1552887 990890 1.567163862790017)
(BRANCH_NULLP 1481470 921264 1.6080841105264072)
(SHIFT 1343633 833419 1.6121938664705269)
(VECTOR_REF 1163491 672164 1.7309629792729155)
(CDR_PUSH 1152293 704387 1.6358805599762631)
(REFER_FREE_PUSH 1111921 682362 1.6295177632986597)
(DISPLAY 1095215 498710 2.196095927492932)
(INDIRECT 1062201 663968 1.5997773989107908)
(REFER_GLOBAL_TOP_LEVEL_APPLY 969965 539236 1.7987764170047993)
(PUSH+REFER_FREE . 2191461)
(REFER_FREE+PUSH . 1781439)
(PUSH+REFER_LOCAL0 . 1280689)
(REFER_GLOBAL_TOP_LEVEL+PUSH . 1036484)
(REFER_LOCAL0+BRANCH_NUMBER_EQUAL . 956298)
(BRANCH_NUMBER_EQUAL+REFER_GLOBAL_TOP_LEVEL . 818827)
(REFER_LOCAL0_PUSH+CONSTANT . 777842)
(SHIFT+APPLY . 663253)
(CONSTANT+VECTOR_REF . 636530)
(VECTOR_REF+PUSH . 626291)
(REFER_FREE+INDIRECT . 619942)
(APPLY+REFER_LOCAL1 . 593562)
(REFER_LOCAL1+BRANCH_NULLP . 589123)
(INDIRECT+SHIFT . 561775)
(REFER_GLOBAL_TOP_LEVEL_APPLY+APPLY . 539238)
(REFER_LOCAL0+PUSH . 515793)
(REFER_LOCAL1+CDR_PUSH . 504596)
(PUSH+DISPLAY . 498710)
(BRANCH_NULLP+REFER_LOCAL1 . 457411)
(CDR_PUSH+REFER_LOCAL0_PUSH . 452196)
(PUSH+REFER_FREE . 2191461)
(REFER_FREE+PUSH . 1781439)
(PUSH+REFER_LOCAL0 . 1280689)
(REFER_GLOBAL_TOP_LEVEL+PUSH . 1036484)
(REFER_LOCAL0+BRANCH_NUMBER_EQUAL . 956298)
(BRANCH_NUMBER_EQUAL+REFER_GLOBAL_TOP_LEVEL . 818827)
(REFER_LOCAL0_PUSH+CONSTANT . 777842)
(SHIFT+APPLY . 663253)
(CONSTANT+VECTOR_REF . 636530)
(VECTOR_REF+PUSH . 626291)
(REFER_FREE+INDIRECT . 619942)
(APPLY+REFER_LOCAL1 . 593562)
(REFER_LOCAL1+BRANCH_NULLP . 589123)
(INDIRECT+SHIFT . 561775)
(REFER_GLOBAL_TOP_LEVEL_APPLY+APPLY . 539238)
(REFER_LOCAL0+PUSH . 515793)
(REFER_LOCAL1+CDR_PUSH . 504596)
(PUSH+DISPLAY . 498710)
(BRANCH_NULLP+REFER_LOCAL1 . 457411)
(CDR_PUSH+REFER_LOCAL0_PUSH . 452196)

./decode.scm

(print (decode "%E7%9B%AE%E3%81%AB%E7%95%99%E3%81%BE%E3%82%8B%E3%81%93%E3%81%A8%2A%20PUSH%2CCONSTANT%2CAPPLY%2CREFER%5FFREE%2CREFER%5FLOCAL0%20%E3%81%8C%E5%A4%9A%E3%81%84%20%2A%20DISPLAY%20%E9%87%8D%E3%81%84%20%2A%20APPLY%20%E9%87%8D%E3%82%81%20%2A%20%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%97%E3%81%A7%E5%A4%9A%E3%81%84%E3%82%82%E3%81%AE%20o%20%E5%BC%95%E6%95%B0%E3%82%92%E5%8F%82%E7%85%A7%E3%81%97%E3%81%A6%E6%AC%A1%E3%81%AE%E6%89%8B%E7%B6%9A%E3%81%8D%E3%81%AE%E5%BC%95%E6%95%B0%E3%81%A8%E3%81%97%E3%81%A6%20PUSH%20%20%20%20%20%20%20%20%20%20o%20%E5%BC%95%E6%95%B0%E3%81%A8%E3%81%97%E3%81%A6PUSH%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%82%92%E3%81%99%E3%81%90%E3%81%AB%E5%8F%82%E7%85%A7%20%20%20%20%2A%20%E5%BD%93%E3%81%9F%E3%82%8A%E5%89%8D%E3%81%A0%E3%81%91%E3%81%A9%20PUSH%20%E3%81%8C%E5%A4%9A%E3%81%84%20%20%20%20%2A%20%E5%9B%9E%E6%95%B0%E3%81%AF%E5%B0%91%E3%81%AA%E3%81%84%E3%81%8C%20BOX%20%E3%81%8C%E9%87%8D%E3%81%84"))
instructions
(PUSH 79609 63083 1.261972322178717)
(REFER_FREE 43735 34284 1.2756679500641699)
(REFER_LOCAL0 41132 33071 1.2437482991140274)
(REFER_LOCAL1 29599 22954 1.2894920275333275)
(APPLY 24588 17634 1.3943518203470568)
(CONSTANT 16396 13034 1.2579407702930796)
(SHIFT 14490 11354 1.2762022194821208)
(BRANCH_NULLP 13993 10960 1.2767335766423358)
(REFER_LOCAL0_PUSH 13658 10828 1.2613594384927964)
(INDIRECT 12976 9855 1.3166920345002537)
(REFER_GLOBAL_TOP_LEVEL 12795 9519 1.3441537976678222)
(CDR_PUSH 12726 9748 1.3054985638079606)
(BRANCH_NUMBER_EQUAL 10980 8777 1.2509969237780563)
(REFER_FREE_PUSH 10952 8505 1.287713109935332)
(DISPLAY 9715 5236 1.855423987776929)
(NUMBER_ADD 8371 6761 1.238130454074841)
(FRAME 8335 6398 1.3027508596436386)
(RETURN 8127 6398 1.2702407002188183)
(CONSTANT_PUSH 7194 5826 1.23480947476828)
(LET_FRAME 6791 5409 1.2555000924385284)
(REFER_GLOBAL_TOP_LEVEL_APPLY 6747 4735 1.424920802534319)
(ENTER 6739 5409 1.245886485487151)
(BRANCH_EQ 6243 4914 1.2704517704517704)
(VECTOR_REF 5192 3941 1.31743212382644)
(LOCAL_JMP 5177 4093 1.2648424138773515)
(CLOSURE 4945 2997 1.6499833166499833)
(TEST 4817 3708 1.2990830636461705)
(CAR_PUSH 4668 3593 1.2991928750347899)
(CONS 3903 2861 1.364208318769661)
(REFER_LOCAL1_PUSH 3891 3184 1.2220477386934674)
patterns
(PUSH+REFER_FREE . 23629)
(REFER_FREE+PUSH . 19502)
(PUSH+REFER_LOCAL0 . 11864)
(SHIFT+APPLY . 10088)
(REFER_FREE+INDIRECT . 9154)
(INDIRECT+SHIFT . 8977)
(REFER_GLOBAL_TOP_LEVEL+PUSH . 8808)
(APPLY+REFER_LOCAL1 . 8182)
(REFER_LOCAL0+BRANCH_NUMBER_EQUAL . 8049)
(REFER_LOCAL1+CDR_PUSH . 7172)
(REFER_LOCAL1+BRANCH_NULLP . 7107)
(BRANCH_NUMBER_EQUAL+REFER_GLOBAL_TOP_LEVEL . 6902)
(REFER_LOCAL0_PUSH+CONSTANT . 6881)
(NUMBER_ADD+PUSH . 6725)
(CONSTANT+NUMBER_ADD . 6713)
(REFER_LOCAL0+PUSH . 6410)
(CDR_PUSH+REFER_LOCAL0_PUSH . 6221)
(BRANCH_NULLP+REFER_LOCAL1 . 5826)
(PUSH+DISPLAY . 5236)
(REFER_GLOBAL_TOP_LEVEL_APPLY+APPLY . 4735)

./bench/fib.scm

(define (fib n)
  (if (<= n 2) 1
      (+ (fib (- n 1)) (fib (- n 2)))))
(write (fib 26))
(display "  :")
instructions
(PUSH 964430 613650 1.5716287786197343)
(CONSTANT 957921 608342 1.574642224275161)
(APPLY 442215 244241 1.810568250211881)
(REFER_GLOBAL_TOP_LEVEL_APPLY 430324 243351 1.7683264091785118)
(FRAME 394322 243372 1.6202439064477425)
(RETURN 390584 243373 1.6048781089110131)
(REFER_LOCAL0 388438 245562 1.5818326939835967)
(BRANCH_NUMBER_LE 385984 242785 1.5898181518627592)
(REFER_LOCAL0_PUSH 378136 244139 1.5488553651813106)
(NUMBER_SUB 376316 242788 1.5499777583735606)
(LOCAL_JMP 189409 121636 1.557178795751258)
(NUMBER_ADD 187490 121949 1.5374459815168635)
(REFER_FREE 5669 3670 1.5446866485013624)
(REFER_LOCAL1 3119 2073 1.5045827303424988)
(CONSTANT_PUSH 2380 1589 1.497797356828194)
(BOX 1542 359 4.295264623955432)
(DISPLAY 1325 622 2.130225080385852)
(BRANCH_EQ 1319 868 1.5195852534562213)
(SHIFT 1315 876 1.5011415525114156)
(REFER_FREE_PUSH 1204 769 1.5656697009102731)
(CLOSURE 1171 642 1.82398753894081)
(BRANCH_NULLP 1079 704 1.5326704545454546)
(INDIRECT 1030 670 1.537313432835821)
(CDR_PUSH 1019 642 1.587227414330218)
(VECTOR_SET 986 642 1.5358255451713396)
(ENTER 973 637 1.5274725274725274)
(LET_FRAME 969 637 1.5211930926216641)
(REFER_GLOBAL_TOP_LEVEL 931 537 1.733705772811918)
(VECTOR_REF 859 524 1.6393129770992367)
(LEAVE 765 401 1.9077306733167083)
(UNDEF 755 492 1.5345528455284554)
patterns
(REFER_LOCAL0+PUSH . 243582)
(REFER_GLOBAL_TOP_LEVEL_APPLY+APPLY . 243351)
(REFER_LOCAL0_PUSH+CONSTANT . 243291)
(APPLY+REFER_LOCAL0 . 243013)
(PUSH+CONSTANT . 242884)
(PUSH+REFER_GLOBAL_TOP_LEVEL_APPLY . 242854)
(FRAME+REFER_LOCAL0_PUSH . 242832)
(CONSTANT+NUMBER_SUB . 242789)
(NUMBER_SUB+PUSH . 242789)
(CONSTANT+BRANCH_NUMBER_LE . 242785)
(RETURN+PUSH . 121752)
(PUSH+FRAME . 121555)
(LOCAL_JMP+RETURN . 121534)
(CONSTANT+LOCAL_JMP . 121420)
(RETURN+NUMBER_ADD . 121404)
(BRANCH_NUMBER_LE+CONSTANT . 121393)
(BRANCH_NUMBER_LE+FRAME . 121392)
(NUMBER_ADD+RETURN . 121392)
(PUSH+REFER_FREE . 2391)
(REFER_FREE+PUSH . 2113)

./bench/case.scm

(define (loop i l)
  (case 6
    ((1 2 3 4 5) #f)
    ((6)
     (if (< i l)
         (loop (+ 1 i) l)
         l))))
(write (loop 0 500000))
(display "  :")
instructions
(PUSH 3123620 2009296 1.5545842922098088)
(CONSTANT_PUSH 3079815 2001805 1.5385189866145803)
(REFER_FREE 2365809 1504931 1.5720381864683497)
(REFER_LOCAL0 2342429 1504020 1.5574453797156953)
(BRANCH_EQ 1570597 1001033 1.568976247536295)
(DISPLAY 1027288 500844 2.0511137200405716)
(APPLY 871202 502045 1.7353065960222689)
(REFER_GLOBAL_TOP_LEVEL_APPLY 861975 500757 1.7213438853575687)
(REFER_FREE_PUSH 799363 501137 1.5950987454528402)
(SHIFT 787851 501199 1.5719325058509694)
(REFER_LOCAL1 778685 502787 1.5487373380775558)
(LET_FRAME 777929 500862 1.5531803171332623)
(NUMBER_ADD 774629 500738 1.5469746653938787)
(BRANCH_NUMBER_LT 771865 500001 1.543726912546175)
(ENTER 764880 500864 1.5271211346792741)
(CONSTANT 3601 1829 1.9688354291962822)
(REFER_LOCAL0_PUSH 2561 1703 1.5038167938931297)
(BRANCH_NULLP 2280 1018 2.239685658153242)
(FRAME 1698 855 1.9859649122807017)
(RETURN 1684 855 1.9695906432748538)
patterns
(CONSTANT_PUSH+REFER_LOCAL0 . 1000817)
(REFER_LOCAL0+BRANCH_EQ . 1000692)
(PUSH+REFER_FREE . 503279)
(REFER_FREE+PUSH . 502953)
(PUSH+REFER_LOCAL0 . 501221)
(REFER_LOCAL0+PUSH . 501112)
(PUSH+DISPLAY . 500844)
(REFER_GLOBAL_TOP_LEVEL_APPLY+APPLY . 500758)
(NUMBER_ADD+PUSH . 500732)
(REFER_LOCAL1+PUSH . 500671)
(BRANCH_EQ+CONSTANT_PUSH . 500654)
(CONSTANT_PUSH+REFER_FREE . 500453)
(APPLY+LET_FRAME . 500434)
(SHIFT+REFER_GLOBAL_TOP_LEVEL_APPLY . 500242)
(PUSH+REFER_FREE_PUSH . 500211)
(ENTER+CONSTANT_PUSH . 500061)
(REFER_FREE_PUSH+SHIFT . 500054)
(LET_FRAME+REFER_LOCAL1 . 500022)
(BRANCH_EQ+REFER_FREE . 500020)
(DISPLAY+CONSTANT_PUSH . 500008)

./bench/let.scm

(define a 100)
(write (let1 a1 a
         (let1 a2 a
           (let1 a3 a
             (let1 a4 a
               (let1 a5 a
                 (let1 a6 a
                   (let1 a7 a
                     (let1 a8 a
                       (let1 a9 a
                         (let1 a10 a
                           (let1 a11 a
                             (let1 a12 a
                               (let1 a13 a
                                 (let1 a14 a
                                   (let1 a15 a
                                     (let1 a16 a
                                       (let1 a17 a
                                         (let1 a18 a
                                           (let1 a19 a
                                             (let1 a20 a
                                               (let1 a21 a
                                                 (let1 a22 a
                                                   (let1 a23 a
                                                     (let1 a24 a
                                                       (let1 a25 a
                                                         (let1 a26 a
                                                           (let1 a27 a
                                                             (let1 a28 a
                                                               (let1 a29 a
                                                                 (let1 a30 a
                                                                   (+ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26 a27 a28 a29))))))))))))))))))))))))))))))))

instructions
(PUSH 251887 197966 1.2723750543022538)
(REFER_LOCAL0 173178 138421 1.251096293192507)
(REFER_FREE 133150 105011 1.267962403938635)
(REFER_LOCAL1 84476 67001 1.2608170027313026)
(APPLY 84283 61508 1.370277037133381)
(REFER_GLOBAL_TOP_LEVEL 56204 40806 1.3773464686565702)
(BRANCH_NULLP 50317 39824 1.2634843310566493)
(CDR_PUSH 46688 36453 1.2807725015773737)
(BRANCH_NUMBER_EQUAL 45986 36180 1.2710337202874515)
(SHIFT 43112 34434 1.2520183539524887)
(CONSTANT 42546 33741 1.2609584778163065)
(FRAME 35437 27596 1.2841353819394115)
(RETURN 35094 27596 1.2717060443542543)
(INDIRECT 34719 27522 1.2614998909962938)
(REFER_FREE_PUSH 34261 26244 1.3054793476604176)
(REFER_LOCAL0_PUSH 32271 25487 1.2661749127005926)
(DISPLAY 28256 17371 1.6266190777733003)
(REFER_GLOBAL_TOP_LEVEL_APPLY 27335 19681 1.3889030028961944)
(CAR_PUSH 25855 19685 1.3134366268732538)
(CONS 25452 17756 1.4334309529173237)
patterns
(PUSH+REFER_FREE . 63973)
(REFER_FREE+PUSH . 58969)
(PUSH+REFER_LOCAL0 . 46422)
(REFER_GLOBAL_TOP_LEVEL+PUSH . 37795)
(REFER_LOCAL0+BRANCH_NUMBER_EQUAL . 34426)
(SHIFT+APPLY . 29847)
(BRANCH_NUMBER_EQUAL+REFER_GLOBAL_TOP_LEVEL . 29406)
(REFER_FREE+INDIRECT . 24922)
(INDIRECT+SHIFT . 24845)
(APPLY+REFER_LOCAL0 . 24026)
(REFER_LOCAL0+PUSH . 19906)
(REFER_GLOBAL_TOP_LEVEL_APPLY+APPLY . 19681)
(APPLY+REFER_LOCAL1 . 19166)
(REFER_LOCAL1+CDR_PUSH . 18989)
(PUSH+DISPLAY . 17371)
(REFER_LOCAL0+CAR_PUSH . 16802)
(REFER_LOCAL1_PUSH+REFER_LOCAL0 . 16621)
(REFER_LOCAL0+CDR_PUSH . 16588)
(RETURN+PUSH . 16373)
(REFER_LOCAL1+BRANCH_NULLP . 16324)

./bench/tak.scm

(define (cpstak x y z)
  (define (tak x y z k)
    (if (not (< y x))
        (k z)
        (tak (- x 1)
             y
             z
             (lambda (v1)
               (tak (- y 1)
                    z
                    x
                    (lambda (v2)
                      (tak (- z 1)
                           x
                           y
                           (lambda (v3)
                             (tak v1 v2 v3 k)))))))))
  (tak x y z (lambda (a) a)))
(write (cpstak 18 12 6))
(display "  :")
instructions
(PUSH 450490 357814 1.2590060757823898)
(REFER_FREE 278411 218810 1.2723870024221928)
(REFER_FREE_PUSH 186235 146275 1.2731840710989575)
(APPLY 157882 117337 1.345543179048382)
(SHIFT 147714 114991 1.2845700967901836)
(REFER_LOCAL0 134823 107107 1.2587692681150624)
(REFER_LOCAL 101797 80463 1.2651404993599542)
(REFER_LOCAL2_PUSH 100823 79809 1.2633036374343745)
(INDIRECT 84712 66550 1.2729075882794891)
(TEST 82440 65318 1.262132949569797)
(REFER_LOCAL1_PUSH 81767 64690 1.2639820683258618)
(NUMBER_LT 80669 63609 1.2682010407332296)
(NOT 80296 63851 1.257552739972749)
(CLOSURE 80077 49156 1.6290381642118967)
(CONSTANT 65674 52590 1.248792546111428)
(NUMBER_SUB 60448 47821 1.264047175926894)
(REFER_LOCAL1 29831 23908 1.2477413418102727)
(REFER_LOCAL0_PUSH 25025 20060 1.247507477567298)
(REFER_LOCAL_PUSH 21063 16396 1.2846425957550622)
(REFER_LOCAL2 20913 16853 1.2409066635020471)
(DISPLAY 4354 2277 1.912165129556434)
patterns
(PUSH+REFER_FREE . 151548)
(REFER_FREE+PUSH . 150525)
(SHIFT+APPLY . 114434)
(INDIRECT+SHIFT . 66354)
(REFER_FREE+INDIRECT . 66221)
(NOT+TEST . 63843)
(APPLY+REFER_LOCAL2_PUSH . 63654)
(REFER_LOCAL2_PUSH+REFER_LOCAL . 63609)
(NUMBER_LT+NOT . 63609)
(REFER_LOCAL+NUMBER_LT . 63609)
(PUSH+REFER_LOCAL0 . 51616)
(REFER_LOCAL0+PUSH . 50545)
(PUSH+CLOSURE . 48677)
(REFER_LOCAL1_PUSH+REFER_LOCAL0 . 48496)
(REFER_FREE_PUSH+REFER_FREE_PUSH . 48373)
(REFER_FREE_PUSH+REFER_FREE . 48331)
(CLOSURE+PUSH . 47916)
(NUMBER_SUB+PUSH . 47821)
(CONSTANT+NUMBER_SUB . 47821)
(TEST+REFER_LOCAL1_PUSH . 47752)