Без оптимизации компилятор сохранит вызов divideC
, поэтому он будет работать медленнее.
С оптимизацией на любом достойном компиляторе известно, что - для данного кода - все, что связано с values
, можно оптимизировать. без побочных эффектов. Таким образом, показанный код никогда не может дать каких-либо значимых измерений между разницей values[i%SIZE] = (2.0 * 3.0 + 10.0) / 0.8;
или values[i%SIZE] = divideC( 3.0 );
С -O1
любой достойный компилятор создаст что-то следующее:
for (int i = 0; i < count; i++)
{
values[i%SIZE] = (2.0 * 3.0 + 10.0) / 0.8;
}
приводит к :
mov rdx, QWORD PTR [rsp+8]
test rdx, rdx
je .L2
mov eax, 0
.L3:
add eax, 1
cmp edx, eax
jne .L3
.L2:
и
for (int i = 0; i < count; i++)
{
values[i%SIZE] = divideC( 3.0 );
}
приводит к:
mov rdx, QWORD PTR [rsp+8]
test rdx, rdx
je .L4
mov eax, 0
.L5:
add eax, 1
cmp edx, eax
jne .L5
.L4:
Таким образом, оба результата приведут к одинаковому машинному коду, содержащему только подсчет l oop и больше ничего. Поэтому, как только вы включите оптимизацию, вы будете измерять только l oop, но ничего не связанное с constexpr
.
С -O2
даже l oop будет оптимизировано, и вы будете измерять только :
clock_t time1 = clock();
time1 = clock() - time1;
cout << "Time1: " << float(time1)/float(CLOCKS_PER_SEC) << " seconds" << endl;