合成命令 + 測定 その2 - Scheme VM を書く

さあ実際に合成していきましょう。
前回の測定から頻出パターンスクリプトを改善して測定し直しました。

合成命令なし

全く合成命令がない状態での測定結果です。
(REFER_LOCAL 0) が頻出の様です。
(REFER_LOCAL 0 PUSH) も頻出ですが
まずは (REFER_LOCAL 0 PUSH) => (REFER_LOCAL_0_PUSH) という合成をやってみましょう。

benchmark gosh sec our sec count insn1 insn2 insn3 insn4 insn5
./bench/fib.scm 0.43 0.79 43158716 (REFER_LOCAL0)(5392266times, 12.49%) (REFER_LOCALPUSH)(5392247times, 12.49%) (REFER_LOCAL0PUSH)(5388461times, 12.49%) (PUSHCONSTANT)(5388182times, 12.48%) (REFER_LOCALPUSHCONSTANT)(5387020times, 12.48%)
./bench/case.scm 0.28 0.39 17094662 (CONSTANTPUSH)(2003045times, 11.72%) (REFER_LOCAL0)(1508824times, 8.83%) (PUSHREFER_LOCAL)(1508698times, 8.83%) (PUSHREFER_FREE)(1507229times, 8.82%) (PUSHREFER_LOCAL0)(1505022times, 8.8%)
./bench/let.scm 0.02 0.08 1648816 (REFER_LOCAL0)(179829times, 10.91%) (PUSHREFER_LOCAL)(124371times, 7.54%) (PUSHREFER_FREE)(120011times, 7.28%) (REFER_LOCALPUSH)(101032times, 6.13%) (PUSHREFER_LOCAL0)(96070times, 5.83%)
./bench/takl.scm 0.09 1.01 29434795 (REFER_LOCAL0)(3050105times, 10.36%) (REFER_FREEPUSH)(2961361times, 10.06%) (PUSHREFER_FREE)(2112370times, 7.18%) (REFER_FREE0)(2103086times, 7.14%) (REFER_FREE1)(2099969times, 7.13%)
./bench/array1.scm 5.84 8.81 235052268 (REFER_LOCAL0)(42737549times, 18.18%) (REFER_LOCALPUSH)(32054363times, 13.64%) (REFER_LOCAL0PUSH)(32044367times, 13.63%) (PUSHREFER_LOCAL)(21378930times, 9.1%) (PUSHREFER_FREE)(21375371times, 9.09%)
./bench/cpstak.scm 0.63 0.41 20259761 (PUSHREFER_FREE)(3038263times, 15.0%) (REFER_FREEPUSH)(2878515times, 14.21%) (REFER_LOCALPUSH)(2721451times, 13.43%) (PUSHREFER_LOCAL)(2563930times, 12.66%) (PUSHREFER_FREEPUSH)(2396950times, 11.83%)
./bench/sum.scm 0.13 0.18 19132908 (REFER_LOCALPUSH)(3011611times, 15.74%) (REFER_LOCAL1)(3005922times, 15.71%) (REFER_LOCAL1PUSH)(3002930times, 15.7%) (PUSHREFER_LOCAL)(2011526times, 10.51%) (PUSHCONSTANT)(2005030times, 10.48%)
./bench/tak.scm 1.05 1.96 119403924 (REFER_LOCALPUSH)(20684827times, 17.32%) (PUSHREFER_LOCAL)(15913941times, 13.33%) (REFER_LOCAL1)(11137364times, 9.33%) (REFER_LOCALPUSHREFER_LOCAL)(11136631times, 9.33%) (REFER_LOCAL1PUSH)(11134121times, 9.32%)

REFER_LOCAL_0_PUSH の導入

let が遅くなってしまいました。(コンパイラが合成命令を生成する所で遅くなっていると思われる。)
命令数が大きく減ったところは速くなっています。

./bench/fib.scm 0.43 0.76 37800402 (REFER_LOCAL0_PUSHCONSTANT)(5386732times, 14.25%) (APPLY_1)(2694592times, 7.13%) (PUSHREFER_GLOBAL)(2694275times, 7.13%) (RETURN_1)(2693830times, 7.13%) (REFER_GLOBALAPPLY_)(2693634times, 7.13%)
./bench/case.scm 0.28 0.39 16634056 (CONSTANTPUSH)(2003064times, 12.04%) (PUSHREFER_FREE_)(1507959times, 9.07%) (REFER_FREE_PUSH)(1009639times, 6.07%) (REFER_LOCAL_0)(1007113times, 6.05%) (PUSHREFER_LOCAL_)(1006871times, 6.05%)
./bench/let.scm 0.02 1.41 2409472 (REFER_LOCAL_0)(162936times, 6.76%) (REFER_FREE_PUSH)(138249times, 5.74%) (PUSHREFER_FREE_)(132174times, 5.49%) (PUSHREFER_LOCAL_)(107776times, 4.47%) (REFER_FREE_0)(103597times, 4.3%)
./bench/takl.scm 0.09 1.04 29019315 (REFER_FREE_PUSH)(2965792times, 10.22%) (REFER_LOCAL_0)(2571149times, 8.86%) (PUSHREFER_FREE_)(2113103times, 7.28%) (REFER_FREE_0)(2107640times, 7.26%) (REFER_FREE_1)(2101643times, 7.24%)
./bench/array1.scm 5.91 7.91 198127001 (REFER_FREE_INDIRECT)(15624537times, 7.89%) (REFER_LOCAL0_PUSHCONSTANT)(15614235times, 7.88%) (REFER_LOCAL_0)(10430870times, 5.26%) (PUSHREFER_FREE_)(10430464times, 5.26%) (REFER_FREE_PUSH)(10425828times, 5.26%)
./bench/cpstak.scm 0.64 0.46 19685021 (REFER_FREE_PUSH)(2883089times, 14.65%) (PUSHREFER_FREE_)(2402644times, 12.21%) (REFER_LOCAL_PUSH)(2076578times, 10.55%) (PUSHREFER_LOCAL_)(1923021times, 9.77%) (PUSHREFER_FREE_PUSH)(1760545times, 8.94%)
./bench/sum.scm 0.13 0.18 19173023 (REFER_LOCAL_PUSH)(3006274times, 15.68%) (REFER_LOCAL_1)(3005851times, 15.68%) (REFER_LOCAL_1PUSH)(3002917times, 15.66%) (PUSHREFER_LOCAL_)(2009163times, 10.48%) (PUSHCONSTANT)(2004936times, 10.46%)
./bench/tak.scm 1.07 2.11 117850699 (REFER_LOCAL_PUSH)(19088819times, 16.2%) (PUSHREFER_LOCAL_)(15911252times, 13.5%) (REFER_LOCAL_1)(11137307times, 9.45%) (REFER_LOCAL_PUSHREFER_LOCAL_)(11134742times, 9.45%) (REFER_LOCAL_1PUSH)(11134112times, 9.45%)