高速化チューニング その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

続くかも。