gprof の使い方を学んでいたところ、このコードで奇妙な結果が得られました。
int one(int a, int b)
{
int i, r = 0;
for (i = 0; i < 1000; i++)
{
r += b / (a + 1);
}
return r;
}
int two(int a, int b)
{
int i, r = 0;
for (i = 0; i < 1000; i++)
{
r += b / (a + 1);
}
return r;
}
int main()
{
for (int i = 1; i < 50000; i++)
{
one(i, i * 2);
two(i, i * 2);
}
return 0;
}
これはプロファイラーの出力です
% cumulative self self total
time seconds seconds calls us/call us/call name
50.67 1.14 1.14 49999 22.80 22.80 two(int, int)
49.33 2.25 1.11 49999 22.20 22.20 one(int, int)
1 つを呼び出してから 2 つを呼び出すと、結果は逆になり、2 つが 1 つよりも時間がかかります
が、どちらも同じ関数ですが、最初の呼び出しは常に 2 番目の呼び出しよりも時間がかかりません
何故ですか?
注: アセンブリ コードはまったく同じであり、コードは最適化なしでコンパイルされています。