高速化チューニング その2 - Scheme VM を書く
昨日までの反省点いくつか。
- -D GC_DEBUG の ON/OFF で20-30倍も速度が違うので OFF にすべきだった
- GC_DEBUG を OFF にすると昨日のコードでは実行がすぐ終わってしまうのでもうすこし負荷が高めのコードにすべき。
- 最適化オプションをつけていなかったが配布時に想定している -O2 -fomit-frame-pointer をあらかじめつけておく。
高速化の対象コードはテストコード数百件をまとめたもの。
また Gaku さんのアドバイスにあるように以下のように自分の位置を確認しつつ進めよう。
(1)データ構造の把握。データにアクセスする手段が最小限である事のチェック。(最初は大枠のレベルで。後にだんだん細かく。
- 処理系の基本データ構造である Object 自体のアクセスは最小限にとどめられていると思う
- コンパイラが基本として使う iform は vector ベースで同じく最小限にとどめられていると思う。(アクセサもインストラクションになっているし)
(2)全体の処理を主要な部分に分ける。それぞれの部分でどれくらいの比率で時間を食っているかの把握。
VM初期化 | 0ms |
---|---|
コンパイラロード | 5ms |
コンパイラeval | 1ms |
組み込みマクロのロード | 3ms |
compile | 383ms |
eval | 27ms |
get-timeofday で地味に計測。
特徴としては
ちなみにコンパイラは VM 上で動いているので、VM を速くするとコンパイラが速くなる可能性があることに注意。
もう少し深く追ってみよう。コンパイラは大まかに pass1 〜 pass4 に処理が分かれているので比率を見てみよう。
調べてみたら pass3 コード生成が遅かった。
pass1/expand | 93914 |
---|---|
pass1/sexp->iform | 4405472 |
pass2/optimize | 1405632 |
pass3 | 17225987 |
pass4 | 185130 |
続くかも。