Как я могу легко сравнивать 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
}
Было бы здорово, если бы библиотека позволяла вам делать много прогонов, усредняя их и вычисляя дисперсию по времени!
Ответы
Ответ 1
В принципе, все, что вам нужно, это таймер с высоким разрешением. Истекшее время - это, конечно, разница во времени, а ускорение рассчитывается путем деления времени на каждую задачу. Я включил код для таймера с высоким разрешением, который должен работать, по крайней мере, с окнами и 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
Ответ 2
Используйте функцию clock()
, определенную в time.h
:
startTime = (float)clock()/CLOCKS_PER_SEC;
/* Do work */
endTime = (float)clock()/CLOCKS_PER_SEC;
timeElapsed = endTime - startTime;
Ответ 3
В POSIX попробуйте getrusage. Соответствующим аргументом является RUSAGE_SELF, а соответствующие поля - ru_utime.tv_sec и ru_utime.tv_usec.
Ответ 4
Могут существовать существующие утилиты, которые помогают в этом, но я подозреваю, что большинство из них будет использовать какую-то выборку или, возможно, инъекцию. Но для получения определенных разделов кода времени вам, вероятно, придется добавлять вызовы к таймеру, как показано в вашем примере. Если вы используете Windows, то работает высокопроизводительный таймер. Я ответил на аналогичный вопрос и показал пример кода, который это сделает. Аналогичные методы для Linux существуют.