Время измерения в C - программирование
Подтвердить что ты не робот

Время измерения в C

Я пытаюсь измерить некоторую активность в C (Матричное умножение) и заметил, что я должен сделать что-то вроде этого:

clock_t start = clock();
sleep(3);
clock_t end = clock();
double elapsed_time = (end - start)/(double)CLOCKS_PER_SEC;
printf("Elapsed time: %.2f.\n", elapsed_time);

Вывод:

Elapsed time: 0.00.

Почему это происходит?

4b9b3361

Ответ 1

clock оценивает время процессора, используемое вашей программой; что время, в течение которого процессор был занят, выполняет инструкции, принадлежащие вашей программе. sleep не выполняет никакой работы, поэтому он не требует заметного времени процессора (даже если оно требует времени настенного монтажа).

Если вы хотите измерить время разгона, используйте time:

time_t start = time(NULL);
sleep(3);
printf("%.2f\n", (double)(time(NULL) - start));

напечатает число, близкое к трем.

Ответ 2

В качестве побочного примечания, если вы хотите более точно измерить время выполнения (миллисекунды), time не является точным достаточно. Вместо этого вы можете использовать gettimeofday:

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>

int main() {
    long start, end;
    struct timeval timecheck;

    gettimeofday(&timecheck, NULL);
    start = (long)timecheck.tv_sec * 1000 + (long)timecheck.tv_usec / 1000;

    usleep(200000);  // 200ms

    gettimeofday(&timecheck, NULL);
    end = (long)timecheck.tv_sec * 1000 + (long)timecheck.tv_usec / 1000;

    printf("%ld milliseconds elapsed\n", (end - start));

    return 0;
}

Ответ 3

Вы должны использовать time_t start = time(NULL); и time_t end = time(NULL);, чтобы получить правильные значения.

Ответ 4

Если вам не нужно привязываться к Windows, вы можете попробовать таймер с высоким разрешением. Он намного точнее, чем time(), который имеет только одну секунду, поскольку использует формат UNIX.

#include <iostream>
#include <windows.h>

__int64 countspersec = 0;
double secpercount = 0.0;
__int64 starttime = 0;
__int64 curtime = 0;

int main() {

    // Get current time, and determine how fast the clock ticks
    QueryPerformanceCounter((LARGE_INTEGER*)&starttime);
    QueryPerformanceFrequency((LARGE_INTEGER*)&countspersec);
    secpercount = 1.0/(double)countspersec;

    /* calculate something */

    // Standard end-start stuff, account for clock speed
    QueryPerformanceCounter((LARGE_INTEGER*)&curtime);
    std::cout << "Time needed: " << (curtime-starttime)*secpercount << " sec\n";
    return 0;
}

Ответ 5

Используйте QueryPerformanceFrequency(), как описано в Orwells, или используйте GetSystemTimeAsFileTime(). Последний имеет 100 нс гранулярность, но не увеличивается с такой скоростью. Его прирост зависит от подстилающего оборудования и настройки разрешения для мультимедийного таймера. Имейте в виду, что частота, возвращаемая QueryPerformanceFrequency(), рассматривается как константа. Однако, поскольку он генерируется аппаратными средствами, он также имеет смещение и дрейф. Время измерения с использованием QueryPerformanceCounter() обычно сопровождается ошибками в несколько микросекунд в секунду. Я дал этот и этот ответ на аналогичные вопросы.