基准代码 - 除以迭代次数与否?

时间:2013-07-15 11:37:15

标签: c++ benchmarking getrusage

我和我的朋友讨论了一个关于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 ......

所以这是我的问题:

  1. 我们应该将(e-s)除以迭代次数,如果是,为什么?
  2. 我们如何以更易读的形式打印2.34385e-07? (比方说,耗时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";
    

1 个答案:

答案 0 :(得分:3)

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

    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
    
  5. 这个评分是时间独立的,所以你可以比较不同的函数变化,函数得分不到一分......并且要小心除零:)