Как я могу легко тестировать код C? - PullRequest
49 голосов
/ 28 февраля 2010

Существует ли простая библиотека для сравнения времени выполнения части кода на 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
}

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

Ответы [ 4 ]

37 голосов
/ 28 февраля 2010

По сути, все, что вам нужно, это таймер высокого разрешения. Прошедшее время - это, конечно, только разница во времени, и ускорение рассчитывается путем деления времени для каждой задачи. Я включил код для таймера высокого разрешения, который должен работать как минимум на windows и 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
36 голосов
/ 09 августа 2011

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

startTime = (float)clock()/CLOCKS_PER_SEC;

/* Do work */

endTime = (float)clock()/CLOCKS_PER_SEC;

timeElapsed = endTime - startTime;
1 голос
/ 28 февраля 2010

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

0 голосов
/ 28 февраля 2010

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

...