合成命令 + 測定 その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%) |