VM の構造を変えない限りはアルゴリズム的に改善する余地はあまりない。
そこで C++ 実装面での最適化を行う。
Wiki のコードのコンパイルにかかる時間を基準に計測しつつ最適化。
| 対応 | sec |
|---|---|
| 元の状態 | 0.650 |
| -fomit-frame-pointerをつける | 0.400 |
| always inline | 0.400 |
| VMスタックの操作を Intオブジェクトではなく native int | 0.400 |
| Closureの構造をVectorから nativeクラス | 0.370 |
| Pair Pointerを特別扱い | 0.370 |
速くなると読んでいた
- Pairの構造変更
- スタック操作
の2つが全く速くならず。
ダメ元の -fomit-frame-pointer と、そこまで速くならないだろうと思った Closure 構造変更が速くなりショック。
そういえば gcc の警告オプションで -Winline を見つけた。
inline 指定されているのに inlined にならなかったら警告が出る。
いつも ON にしていると気が滅入るのでたまに ON が良い。