如何轻松地对C代码进行基准测试?




benchmarking (4)

使用time.h定义的函数clock()

startTime = (float)clock()/CLOCKS_PER_SEC;

/* Do work */

endTime = (float)clock()/CLOCKS_PER_SEC;

timeElapsed = endTime - startTime;

是否有一个简单的库可以对执行部分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
}

如果图书馆允许你进行多次运行,平均它们并计算时间差异,这也会很棒!


在POSIX中,尝试getrusage 。 相关参数为RUSAGE_SELF,相关字段为ru_utime.tv_sec和ru_utime.tv_usec。


可能有现成的实用程序可以帮助解决这个问题,但我怀疑大多数会使用某种取样或可能的注射。 但是为了获得特定时间段的代码,您可能需要添加对您在示例中显示的计时器的调用。 如果您使用的是Windows,则可以使用高性能计时器。 我回答了类似的问题并展示了可以做到这一点的示例代码。 Linux有类似的方法。


基本上,你想要的只是一个高分辨率计时器。 经过的时间当然只是时间的差异,并且通过除以每个任务的时间来计算加速。 我已经包含了一个高分辨率计时器的代码,该计时器至少可以在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




benchmarking