Я учился использовать 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)
Если я вызову один, а затем два, результат будет обратным, два занимают больше времени, чем один
обе функции одинаковы, но первый вызов всегда занимает меньше времени, чем второй
Это почему?
Примечание. Ассемблерный код точно такой же, и код компилируется без оптимизации.