Я делал простой тест для измерения времени выполнения моей программы.Поэтому я написал простую программу с двумя циклами, каждая из которых повторяется N
раз и 2N
раз.Я ожидал, что второй цикл займет примерно вдвое больше времени, но результат будет противоположным, когда N=1000000
.
Я протестировал его несколько раз и получил такой же результат на другой машине.Почему это происходит?
Мой код
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
long long sum;
int main(int argc, char **argv)
{
int i;
long elapsed;
struct timeval start, end;
i = atoi(argv[1]);
sum = 0;
gettimeofday(&start, NULL);
while (i--)
sum += i;
gettimeofday(&end, NULL);
elapsed = (end.tv_sec - start.tv_sec) * 1000000;
elapsed += (end.tv_usec - start.tv_usec);
printf("1st loop : %ld\n", elapsed);
i = 2 * atoi(argv[1]);
sum = 0;
gettimeofday(&start, NULL);
while (i--)
sum += i;
gettimeofday(&end, NULL);
elapsed= (end.tv_sec - start.tv_sec) * 1000000;
elapsed+= (end.tv_usec - start.tv_usec);
printf("2nd loop : %ld\n", elapsed);
return 0;
}
Некоторые результаты теста
[arch:test] $ ./a.out 10
1st loop : 0
2nd loop : 0
[arch:test] $ ./a.out 100
1st loop : 1
2nd loop : 1
[arch:test] $ ./a.out 1000
1st loop : 7
2nd loop : 14
[arch:test] $ ./a.out 10000
1st loop : 73
2nd loop : 146
[arch:test] $ ./a.out 100000
1st loop : 725
2nd loop : 1448
[arch:test] $ ./a.out 1000000
1st loop : 5369 <-- always greater than 2nd loop
2nd loop : 3536
[arch:test] $ ./a.out 10000000
1st loop : 20203
2nd loop : 34434
[arch:test] $ ./a.out 100000000
1st loop : 174058
2nd loop : 339812
[arch:test] $ ./a.out 1000000000
1st loop : 1709652
2nd loop : 3392287
Среда тестирования gcc 8.2.1, опция компиляции -O0
тот же результат в Ubuntuили арка линукс но не на windows 10 с cygwin