我和我的朋友就 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 s),但是当我们除它时,它会给我们像 2.34385e-07 s 这样的结果......
这是我的问题:
- 我们应该将 (e-s) 除以迭代次数吗?如果是,为什么?
- 我们如何以更易于阅读的形式打印 2.34385e-07 s? (假设,花了 0.00000003 秒)?
-
我们应该首先调用一次函数,然后测量迭代的 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";
- 如果将时间除以迭代次数,那么您将得到一个函数的运行时间的迭代独立比较,迭代次数越多,结果越精确。编辑:它是 n 次迭代的平均运行时间。
-
您可以将划分时间乘以 1e6 以获得每一个迭代单位的微秒(我假设measureCPU返回秒)
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
这种评分与时间无关,因此您可以比较不同的函数变体,并且该函数的得分可能会低于一分...并且要小心被零除:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)