影響ないはずのコードがベンチマーク結果に影響を及ぼす原因
C で書いたプログラムを、各リリースに対してベンチマークをとってみたら、前回だけ明らかに遅くなっている。今回は元通りに戻っている。およそ 18% 低下していて再現性もあるので、誤差ではなく、原因調査をしてみた。
一時的に遅くなって、元に戻っているので、まずはどのコミットで遅くなったかを絞り込み。これはすぐにできた。
そのコミットでは、以下のようなコードが追加されていた。
if (foo->bar) { baz[foo->bar] = 0; }
ベンチマークでは、この if 文の条件を満たさないので、絶対に中に入ることはないが、念のため、以下のようなデバッグコードを追加してみた。
if (foo->bar) { printf("oops!\n"); baz[foo->bar] = 0; }
これを行うと、18% の低下が解消してしまった。もちろん、デバッグログが出力されることはない。
さて、何故こういうことが起こるのか、ということを説明しなければならない。
僕は、「妖精さんがいたずらしたから」とか「たまたまです!」とか、そういう簡単な説明で済ませられたらいいなぁ、と思ってるんだけど、そういうわけにもいかず、知恵を絞って書くと:
- コードサイズが変わったことで、関数が置かれるページが変わった影響
- テキストが増えたことによって、変数が置かれるページが変わった影響
というぐらい。