2010-02-28 4 views
42

Есть ли простая библиотека для определения времени, необходимого для выполнения части кода C? То, что я хочу что-то вроде:Как я могу легко сравнить C-код?

int main(){ 
    benchmarkBegin(0); 
    //Do work 
    double elapsedMS = benchmarkEnd(0); 

    benchmarkBegin(1) 
    //Do some more work 
    double elapsedMS2 = benchmarkEnd(1); 

    double speedup = benchmarkSpeedup(elapsedMS, elapsedMS2); //Calculates relative speedup 
} 

Было бы замечательно, если библиотека позволит вам сделать много работает, в среднем их и расчета дисперсии по времени!

+0

Большой вопрос, что это помогло мне многое. –

+1

Альтернативы временному программированию: http://stackoverflow.com/questions/7456146/is-there-a-better-way-to-benchmark-ac-program-than-timing –

+1

Большой закрытый вопрос в Linux: http:// /stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux –

ответ

33

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

#ifdef WIN32 

#include <windows.h> 
double get_time() 
{ 
    LARGE_INTEGER t, f; 
    QueryPerformanceCounter(&t); 
    QueryPerformanceFrequency(&f); 
    return (double)t.QuadPart/(double)f.QuadPart; 
} 

#else 

#include <sys/time.h> 
#include <sys/resource.h> 

double get_time() 
{ 
    struct timeval t; 
    struct timezone tzp; 
    gettimeofday(&t, &tzp); 
    return t.tv_sec + t.tv_usec*1e-6; 
} 

#endif 
+6

Время работы Wallclock (как вернулось 'gettimeofday'), возможно, не так уж и полезно -' clock_gettime (CLOCK_PROCESS_CPUTIME_ID, ...) 'часто будет тем, чего там хотят. – caf

+4

@caf: программа, которая использует очень мало процессорного времени, но тратит много времени на блокирование ввода-вывода или ожидание асинхронного ввода-вывода, все еще может восприниматься пользователями как медленное. Важное значение имеют как время процессора, так и время настенного времени. – bk1e

+7

Да, поэтому я квалифицировал свой комментарий с ласковыми словами «может» и «часто»;) Кстати, если время стены * желательно, тогда 'clock_gettime (CLOCK_MONOTONIC, ...)' является лучшим вариантом , потому что в отличие от 'gettimeofday' на него не будут влиять изменения системных часов в течение интервала времени. – caf

1

В POSIX попробуйте getrusage. Соответствующим аргументом является RUSAGE_SELF, а соответствующие поля - ru_utime.tv_sec и ru_utime.tv_usec.

+1

Обратите внимание, что это не реализовано во многих операционных системах UNIX, которые вместо этого используют 'procfs'. (Linux, Solaris) – charliehorse55

0

Могут существовать существующие утилит, которые помогают в этом, но я подозреваю, что большинство из них будет использовать какую-то выборку или, возможно, инъекцию. Но для получения определенных разделов кода времени вам, вероятно, придется добавлять вызовы к таймеру, как показано в вашем примере. Если вы используете Windows, то работает высокопроизводительный таймер. I answered a similar question и показал пример кода, который сделает это. Аналогичные методы для Linux.

26

Используйте функцию clock(), определенный в time.h:

startTime = (float)clock()/CLOCKS_PER_SEC; 

/* Do work */ 

endTime = (float)clock()/CLOCKS_PER_SEC; 

timeElapsed = endTime - startTime; 
+0

Это должен быть принятый ответ вместо конкретной Windows! – Simon

Смежные вопросы