合成命令 + 測定 その1 - Scheme VM を書く
以前実装した合成命令をまず廃止した。この状態からきちんと命令が現れる頻度を測定して採用する合成命令を決める。
make bench とやると以下の表が出力される。(とても時間がかかりますがこりゃ便利)
REFER_LOCAL0とかは合成命令ではなくてオペランドも合わせて表示しているものです。
r5247。考察は明日。
連続して現れる頻度が高いものを上位から列挙しているが、1つ+オペランドとか3つ連続とかも見た方が良いかなあ。
benchmark | gosh sec | our sec | count | insn1 | insn2 | insn3 | insn4 | insn5 | |
---|---|---|---|---|---|---|---|---|---|
./bench/fib.scm | 0.43 | 0.78 | 43160000 | (REFER_LOCAL0 . PUSH)(5388461times, 12.5%) | (PUSH . CONSTANT)(5388182times, 12.5%) | (PUSH . REFER_GLOBAL)(2693828times, 6.2%) | (APPLY1 . REFER_LOCAL0)(2692940times, 6.2%) | (REFER_GLOBAL . APPLY1)(2692699times, 6.2%) | |
./bench/case.scm | 0.28 | 0.4 | 17596295 | (CONSTANT . PUSH)(2003045times, 11.4%) | (PUSH . REFER_LOCAL0)(1505022times, 8.6%) | (PUSH . REFER_FREE0)(1002406times, 5.7%) | (TEST . CONSTANT)(1001690times, 5.7%) | (REFER_LOCAL0 . EQV)(1001425times, 5.7%) | |
./bench/let.scm | 0.02 | 0.08 | 1682808 | (PUSH . REFER_LOCAL0)(96067times, 5.7%) | (PUSH . CONSTANT)(59616times, 3.5%) | (REFER_LOCAL0 . PUSH)(58899times, 3.5%) | (PUSH . REFER_FREE0)(47607times, 2.8%) | (NULL_P . TEST)(39071times, 2.3%) | |
./bench/takl.scm | 0.09 | 1.0 | 29454949 | (PUSH . DISPLAY)(1736238times, 5.9%) | (PUSH . ENTER)(1735611times, 5.9%) | (ENTER . REFER_LOCAL0)(1734429times, 5.9%) | (REFER_LOCAL0 . TEST)(1733958times, 5.9%) | (REFER_FREE1 . PUSH)(1689029times, 5.7%) | |
./bench/array1.scm | 5.81 | 8.68 | 245734890 | (REFER_LOCAL0 . PUSH)(32044367times, 13.0%) | (PUSH . REFER_LOCAL0)(21370555times, 8.7%) | (PUSH . CONSTANT)(15963955times, 6.5%) | (PUSH . REFER_FREE0)(10684209times, 4.3%) | (REFER_FREE0 . INDIRECT)(10680157times, 4.3%) | |
./bench/cpstak.scm | 0.63 | 0.41 | 21377332 | (PUSH . REFER_LOCAL0)(1125582times, 5.3%) | (PUSH . REFER_FREE0)(1119030times, 5.2%) | (REFER_LOCAL2 . PUSH)(956165times, 4.5%) | (REFER_LOCAL1 . PUSH)(799208times, 3.7%) | (PUSH . REFER_LOCAL3)(796058times, 3.7%) | |
./bench/sum.scm | 0.13 | 0.18 | 20135225 | (REFER_LOCAL1 . PUSH)(3002930times, 14.9%) | (PUSH . CONSTANT)(2005029times, 10.0%) | (PUSH . REFER_LOCAL0)(1006866times, 5.0%) | (PUSH . REFER_FREE0)(1003254times, 5.0%) | (PUSH . REFER_LOCAL1)(1002325times, 5.0%) | |
./bench/tak.scm | 1.05 | 1.98 | 120996402 | (REFER_LOCAL1 . PUSH)(11134121times, 9.2%) | (PUSH . REFER_LOCAL2)(9542472times, 7.9%) | (PUSH . REFER_GLOBAL)(6362988times, 5.3%) | (NOT . TEST)(6361204times, 5.3%) | (APPLY3 . REFER_LOCAL1)(6360901times, 5.3%) |