我和我的朋友讨论了一个关于C / C ++代码(或一般代码)的基准测试。我们编写了一个简单的函数,它使用getrusage
来测量给定代码段的cpu时间。 (它测量运行特定函数所需的cpu时间)。让我举个例子:
const int iterations = 409600;
double s = measureCPU();
for( j = 0; j < iterations; j++ )
function(args);
double e = measureCPU();
std::cout << (e-s)/iterations << " s \n";
我们认为,我们应该将(e-s)除以迭代次数吗?我的意思是,当我们不分它时,结果是可以接受的形式(例如3.0秒)但是当我们分开它时,它给我们的结果如2.34385e-07 s ......
所以这是我的问题:
我们应该首先进行一次函数调用,然后测量迭代的cpu时间,如下所示:
// first function call, doesnt bother with it at all
function(args);
// real benchmarking
const int iterations = 409600;
double s = measureCPU();
for( j = 0; j < iterations; j++ )
function(args);
double e = measureCPU();
std::cout << (e-s)/iterations << " s \n";
答案 0 :(得分:3)
你可以将划分的时间乘以1e6,得到每个迭代单位的微秒数(假设measureCPU返回secods)
std::cout << 1e6*(e-s)/iterations << " s \n";
正如@ ogni42所述,你正在从for循环到你测量的时间得到一个开销,所以你可以试着稍微展开循环以降低测量误差,每次迭代做8到16次调用,试试不同的通话计数以查看测量的时间如何变化:
for( j = 0; j < iterations; j++ ) {
function(args);
function(args);
function(args);
function(args);
...
}
你基本上得到的是更低的数字。如果你想要更高,你可以获得更好的得分 衡量功能的不同变化,然后得到最快的时间。这个得分可以得到10分。
score_for_actual_function = 10.0 * fastest_time / time_of_actual_function
这个评分是时间独立的,所以你可以比较不同的函数变化,函数得分不到一分......并且要小心除零:)