3

我和我的朋友就对 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";

我们争论过,我们是否应该将 (es) 除以迭代次数?我的意思是,当我们不划分它时,结果是可接受的形式(例如 3.0 s),但是当我们划分它时,它给我们的结果类似于 2.34385e-07 s ...

所以这是我的问题:

  1. 我们是否应该将(es)除以迭代次数,如果是,为什么?
  2. 我们如何以更易于阅读的形式打印 2.34385e-07 s?(比方说,它花了 0.00000003 秒)?
  3. 我们是否应该先调用一次函数,然后测量迭代的 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";
    
4

1 回答 1

3
  1. 如果您将时间除以迭代次数,那么您将获得一个函数运行时间的迭代独立比较,迭代次数越多,结果越精确。编辑:它是 n 次迭代的平均运行时间。
  2. 您可以将划分的时间乘以 1e6 以获得每个迭代单位的微秒(我假设 measureCPU 返回秒数)

    std::cout << 1e6*(e-s)/iterations << " s \n";
    
  3. 正如@ogni42 所说,您从 for 循环中获得了测量时间的开销,因此您可以尝试稍微展开循环以降低测量误差,每次迭代进行 8 到 16 次调用,尝试不同的调用计数以查看如何测量时间变化:

    for( j = 0; j < iterations; j++ ) {
        function(args);
        function(args);
        function(args);
        function(args);
        ...
    }
    
  4. 你基本上得到的是一个越低越好的数字。如果您想要更高的分数,您可以测量功能的不同变化,然后获得最快的时间。这个可以打10分。

    score_for_actual_function = 10.0 * fastest_time / time_of_actual_function
    

此评分与时间无关,因此您可以比较不同的函数变化,并且该函数的得分可能低于 1 分……并注意除以零 :)

于 2013-07-15T11:59:55.570 回答