Несоответствие в измерении времени выполнения программы - PullRequest
1 голос
/ 11 апреля 2019

Я делал простой тест для измерения времени выполнения моей программы.Поэтому я написал простую программу с двумя циклами, каждая из которых повторяется 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

1 Ответ

1 голос
/ 11 апреля 2019

Вы, вероятно, просто нажимаете 1-й или 2-й график, и половина первого цикла принимает на себя основной удар.gettimeofday должен использовать часы реального времени, поэтому время, потраченное на переключение контекста, действительно считается.Когда вы в следующий раз выполните в 10 раз больше итераций, число переключений контекста должно быть примерно в 10 раз больше, поэтому, если одна половина потребляет одно переключение контекста больше, чем другое, в среднем это не будет иметь большого значения.

Я не смог воспроизвести ваши результаты так хорошо, но если я запустил исполняемый файл с time -v, чтобы было показано # переключений контекста, то время 1-го и 2-го циклов будет самым близким, когда числопереключение контекста - 2 (второе переключение контекста).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...