Как сказано в примечании, время выполнения printf больше, чем время, которое вы хотите измерить, и независимо от этого время, которое вы пытаетесь измерить, слишком мало.
Чтобы иметь мера, которую вы должны поместить квадрат в файл и его вызов в другом файле в al oop, также без использования литералов, иначе сгенерированный код может быть прямым результатом и ничего более (никогда не недооценивайте сила оптимизации, которую компиляторы могут выполнять, когда они знают все, например, C ++ constexpr ).
Так, например:
file c1. c
int square(int num) {
int result = 0;
if (num > 10) {
result += num;
}
return result * result;
}
файл c2. c
int square(int num) {
int result = 0;
int tmp = num > 10;
result = result * tmp + num * tmp + result * !tmp;
return result * result;
}
файл main. c
#include <stdio.h>
extern int square(int);
int main(int argc, char ** argv)
{
int n, v, r = 0;
if ((argc == 3) &&
(sscanf(argv[1], "%d", &n) == 1) &&
(sscanf(argv[2], "%d", &v) == 1))
while (n--)
r += square(v);
return r;
}
Использование первого решения (без оптимизации):
/tmp % gcc c1.c main.c
/tmp % time ./a.out 1000000000 38
2.315u 0.000s 0:02.41 95.8% 0+0k 0+0io 0pf+0w
/tmp % time ./a.out 1000000000 38
2.316u 0.000s 0:02.41 95.8% 0+0k 0+0io 0pf+0w
/tmp % time ./a.out 1000000000 38
2.316u 0.000s 0:02.41 95.8% 0+0k 0+0io 0pf+0w
/tmp %
Использование второго решения (без оптимизации):
/tmp % gcc c2.c main.c
/tmp % time ./a.out 1000000000 38
3.087u 0.000s 0:03.21 95.9% 0+0k 0+0io 0pf+0w
/tmp % time ./a.out 1000000000 38
3.107u 0.000s 0:03.23 95.9% 0+0k 0+0io 0pf+0w
/tmp % time ./a.out 1000000000 38
3.098u 0.000s 0:03.22 95.9% 0+0k 0+0io 0pf+0w
/tmp %
Таким образом, без оптимизации второе предложение требует больше времени, это все еще так, даже если разница между компиляцией с оптимизацией почти равна нулю:
/tmp % gcc -O2 c1.c main.c
/tmp % time ./a.out 1000000000 38
1.337u 0.000s 0:01.39 95.6% 0+0k 0+0io 0pf+0w
/tmp % time ./a.out 1000000000 38
1.336u 0.001s 0:01.39 95.6% 0+0k 0+0io 0pf+0w
/tmp % time ./a.out 1000000000 38
1.343u 0.000s 0:01.39 96.4% 0+0k 0+0io 0pf+0w
/tmp %
/tmp %
/tmp % gcc -O2 c2.c main.c
/tmp % time ./a.out 1000000000 38
1.341u 0.000s 0:01.39 96.4% 0+0k 0+0io 0pf+0w
/tmp % time ./a.out 1000000000 38
1.343u 0.000s 0:01.40 95.7% 0+0k 0+0io 0pf+0w
/tmp % time ./a.out 1000000000 38
1.339u 0.000s 0:01.39 95.6% 0+0k 0+0io 0pf+0w
/tmp %
Я делал под Linux, но вы можете сделать то же самое под Windows, используя свой инструмент для измерения
Для информации, сгенерированный код с оптимизацией:
первый способ:
square:
.LFB0:
.cfi_startproc
movl %edi, %edx
xorl %eax, %eax
imull %edi, %edx
cmpl $11, %edi
cmovge %edx, %eax
ret
второй способ:
square:
.LFB0:
.cfi_startproc
xorl %eax, %eax
cmpl $10, %edi
setg %al
imull %edi, %eax
imull %eax, %eax
ret
.cfi_endproc