About optimazation: inclusive time and exclusive time

NYTProfを使うと,inclusive time*1とexclusive time*2を調べることができる。

XS化というのはこのexclusive timeを減らすためのものだと言える。実際私は,今までは高速化というとexclusive timeしか見ていなかった。ところが,実際にはexclusive timeが10%を超えることはまれで,ホットスポットを集中的にXS化してそのサブルーチン自体が数倍高速になったとしても,プログラム全体からすると普通は数%の高速化にしかならない。
つまり,プログラム全体を10%,20%と高速にするには,inclusive timeを見る必要があるのだ。この場合,特定のサブルーチン呼び出しが30%や40%もの時間を消費していることがある。そういうホットスポットこそ最適化に値する。

これを痛感したのが,最近行ったClass::MOPのget_method_mapまわりの最適化である。このサブルーチンは以前私がXS化してexclusive timeを改善したのだが,それでも時間が掛っていた。しかし,get_method_mapを呼んでいた箇所を,そもそもget_method_mapを使わないように修正したところ,Pure Perlコードであるにも関わらずプログラム全体ではXSコードを使うよりもずっと高速になった。これはexclusive timeではなくinclusive timeに注目した結果であるといえる。または見方を変えれば,一つのサブルーチンという局所よりもプログラムの全体を考慮にいれて最適化した結果ともいえる。

最適化は奥が深い。

*1:あるサブルーチンの中で他のサブルーチンの呼び出しに消費した時間を含む時間

*2:あるサブルーチンの中で他のサブルーチンの呼び出しに消費した時間を含まない時間