2016-09-18 3 views
3

Я пытаюсь получить время выполнения своей программы с использованием заголовка времени и не могу найти какие-либо ресурсы, которые просто используют <time.h>, а не <sys/time.h>.C - время выполнения программы в миллисекундах с использованием <time.h>

Я попытался

time_t startTime;     
time_t endTime;     
long double execTime;   

/* Start timer */ 
time(&startTime); 

..STUFF THAT TAKES TIME.. 

time(&endTime); 
execTime = difftime(endTime, startTime); 

printf("Computing took %Lf\n", execTime * 1000); 

Но это печатает 0 каждый раз .. Я предполагаю, потому что время является целым числом, и мой процесс занимает меньше секунды.

Как показать выполнение в миллисекундах?

Спасибо

ответ

3

Хотя clock_gettime должно быть предпочтительным способом, это Posix, а не стандартные С Они имеют только clock. Он имеет много недостатков, но достаточно хорош для быстрого и грязного измерения.

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 

int main() 
{ 
    int i, j, a[1000000] = { 0 }; 
    clock_t start, stop; 
    srand(0xdeadbeef); 
    start = clock(); 
    // play around with these values, especially with j 
    for (j = 0; j < 100; j++) { 
    for (i = 0; i < 1000000; i++) { 
     a[i] = rand() % 123; 
     a[i] += 123; 
    } 
    } 
    stop = clock(); 
    printf("Time %.10f seconds\n", (double) (stop - start)/CLOCKS_PER_SEC); 
    exit(EXIT_SUCCESS); 
} 
+0

Отлично. Я умножил вывод на 1000, чтобы получить миллисекунды, и я хорош. – Walker

+0

Хотя реализация 'clock' в MSVC дает ** время на стене ** как [указано здесь] (https://msdn.microsoft.com/en-us/library/4e2ess30.aspx) –

+0

@deamentiaemundi это работало на онлайн-компилятор, но как только я привел на сервер, в котором профессор будет его компилировать в .. он возвращает 0,000 миллисекунд каждый раз. Weird – Walker

1

time функция имеет только 1 второе разрешение. Вместо этого используйте gettimeofday, который имеет разрешение в микросекундах.

struct timeval tstart, tend; 
gettimeofday(&tstart, NULL); 
// do something that takes time 
gettimeofday(&tend,NULL); 
+1

Можете ли вы предоставить образец? Спасибо, поэтому mucj – Walker

+0

'gettimeofday' не следует использовать для измерения разницы во времени. Используйте 'clock_gettime (CLOCK_MONOTONIC, & ts_current);' вместо этого, если вы хотите узнать больше, пожалуйста, [проверьте это] (https://blog.habets.se/2010/09/gettimeofday-should-never-be-used- to-measure-time) –

+0

'gettimeofday' является специфичным для UNIX, используйте' clock() 'для быстрого и грязного портативного решения. – chqrlie

2

Правильный способ измерения времени - использовать clock_gettime(CLOCK_MONOTONIC, &ts_current);.

Также gettimeofday() should be avoided.

Полный пример использования clock_gettime() для измерения разницы во времени (как секунд и наносекунд, который можно преобразовать в миллисекундах):

#include <stdio.h> 
#include <time.h> 

struct timespec diff(struct timespec start, struct timespec end) 
{ 
    struct timespec temp; 
    if ((end.tv_nsec-start.tv_nsec)<0) { 
     temp.tv_sec = end.tv_sec-start.tv_sec-1; 
     temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec; 
    } else { 
     temp.tv_sec = end.tv_sec-start.tv_sec; 
     temp.tv_nsec = end.tv_nsec-start.tv_nsec; 
    } 
    return temp; 
} 

int main() 
{ 
    struct timespec time1, time2; 
    int temp = 0; 
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1); 
    for (int i = 0; i< 242000000; i++) 
     temp+=temp; 
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2); 
    printf("Time difference: %ld [s] %ld [ns]", (long) diff(time1,time2).tv_sec, (long) diff(time1,time2).tv_nsec); 
    return 0; 
} 
+0

Обратите внимание, что 'clock_gettime()' недоступно в Mac OS X, поэтому оно не так переносимо, как 'gettimeofday()'. –