Как узнать время выполнения программы? - PullRequest
5 голосов
/ 25 марта 2019

Я использую функцию часов для моей программы c, чтобы напечатать время выполнения текущей программы. Я получаю неправильное время в выводе. Я хочу отобразить время в секундах, миллисекундах и микросекундах.

#include <stdio.h> 
#include <unistd.h>
#include <time.h> 
int main() 
{ 
    clock_t start = clock(); 
    sleep(3);
    clock_t end = clock(); 
    double time_taken = (double)(end - start)/CLOCKS_PER_SEC; // in seconds 

    printf("time program took %f seconds to execute \n", time_taken); 
    return 0; 
} 


time ./time
time program took 0.081000 seconds to execute
real    0m3.002s
user    0m0.000s
sys     0m0.002s

Я ожидаю вывод около 3 секунд, однако он отображается неправильно. Как вы видите , если я запускаю эту программу с использованием командного времени Linux Я получаю правильное время, я хочу отобразить то же время, используя мою программу c.

1 Ответ

3 голосов
/ 26 марта 2019

Вопреки распространенному мнению, функция clock() извлекает процессорное время, а не истекшее время на часах, так как название может сбивать с толку, заставляя людей верить.

Вот язык из стандарта C:

7.27.2.1 Функция clock

Синопсис

#include <time.h>
clock_t clock(void);

Описание

Функция clock определяет используемое время процессора.

Returns

Функция clock возвращает наилучшее приближение реализации к времени процессора, используемому программой с начала определенной эпохой реализации, связанной только с вызовом программы. Чтобы определить время в секундах, значение, возвращаемое функцией часов, следует разделить на значение макроса CLOCKS_PER_SEC. Если используемое время процессора недоступно, функция возвращает значение (clock_t)(−1). Если значение не может быть представлено, функция возвращает неопределенное значение.

Чтобы получить истекшее время, вы должны использовать одно из следующих:

  • функция time() с разрешением 1 секунда
  • функция timespec_get(), которая может быть более точной, но может быть недоступна во всех системах
  • системный вызов gettimeofday(), доступный в системах linux
  • функция clock_gettime().

См. Что конкретно такое настенное время, пользовательское и системное время в UNIX? для получения дополнительной информации по этому вопросу.

Вот модифицированная версия, использующая gettimeoday():

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

int main() {
    struct timeval start, end;

    gettimeofday(&start, NULL);
    sleep(3);
    gettimeofday(&end, NULL);

    double time_taken = end.tv_sec + end.tv_usec / 1e6 -
                        start.tv_sec - start.tv_usec / 1e6; // in seconds

    printf("time program took %f seconds to execute\n", time_taken);
    return 0;
}

Выход:

time program took 3.005133 seconds to execute
...