影響ないはずのコードがベンチマーク結果に影響を及ぼす原因

C で書いたプログラムを、各リリースに対してベンチマークをとってみたら、前回だけ明らかに遅くなっている。今回は元通りに戻っている。およそ 18% 低下していて再現性もあるので、誤差ではなく、原因調査をしてみた。

一時的に遅くなって、元に戻っているので、まずはどのコミットで遅くなったかを絞り込み。これはすぐにできた。

そのコミットでは、以下のようなコードが追加されていた。

if (foo->bar) {
    baz[foo->bar] = 0;
}

ベンチマークでは、この if 文の条件を満たさないので、絶対に中に入ることはないが、念のため、以下のようなデバッグコードを追加してみた。

if (foo->bar) {
    printf("oops!\n");
    baz[foo->bar] = 0;
}

これを行うと、18% の低下が解消してしまった。もちろん、デバッグログが出力されることはない。


さて、何故こういうことが起こるのか、ということを説明しなければならない。

僕は、「妖精さんがいたずらしたから」とか「たまたまです!」とか、そういう簡単な説明で済ませられたらいいなぁ、と思ってるんだけど、そういうわけにもいかず、知恵を絞って書くと:

  • コードサイズが変わったことで、関数が置かれるページが変わった影響
  • テキストが増えたことによって、変数が置かれるページが変わった影響

というぐらい。