Как я могу легко сравнивать 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 существуют.