C++ 基准代码-是否除以迭代次数?

C++ 基准代码-是否除以迭代次数?,c++,benchmarking,getrusage,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()

我和我的朋友进行了一次有趣的讨论,讨论了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";
const int iterations=409600;
双s=measureCPU();
对于(j=0;j如果将时间除以迭代次数,则将得到一个函数的运行时间的独立于迭代的比较,迭代次数越多,结果越精确。编辑:它是n次迭代的平均运行时间
  • 您可以将除以的时间乘以1e6,得到每个迭代单元的微秒数(我假设measureCPU返回secods)


  • 该评分与时间无关,因此您可以比较不同的功能变化,该功能的评分可以少于一分。。。请注意,除法:“< /p>不知怎么我认为代码> STD::CUT//Cord<不是C,而是C++。为什么你认为代码> 0 0000000 3 可读?”丹尼尔费舍尔:对不起,添加了<代码> C++ >代码>标签;我觉得这个问题有点奇怪。除以循环计数是另一个问题,然后测量精确的运行时间。这取决于必须测量什么。如果您想分析瓶颈代码,平均运行时应该给出足够好的指示,但函数调用的数量更为重要。如果您有特定的计时要求,则必须测量单个运行时,并确保所有分支都没有超出您的要求。所以问题是,你想测量什么?我会考虑对<代码>函数(ARGS)进行初始调用,它不包含在迭代计数和时间间隔中,以便将机器代码加载到CPU缓存中所需的时间打折。此外,考虑通过执行初始循环来自动校准所需的迭代次数,计算在1秒内可以执行多少个循环。而且,在实际性能测量阶段之前,请调用
    sched_yield
    为您提供完整的时间片。关于1=那么这是测量一段代码的最佳方法吗?它仍然不是机器独立的。。。您必须在不同的机器上尝试您的代码,并对每个函数的平均运行时间求一个平均值。Variant 1:不,您得到的是函数的总时间加上循环开销。由于每个函数调用花费的时间如此之少,循环的开销很可能是不可忽略的。那么他应该让for循环更平坦吗?就像在一次迭代中调用一个函数16次一样
    // 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";
    
    std::cout << 1e6*(e-s)/iterations << " s \n";
    
    for( j = 0; j < iterations; j++ ) {
        function(args);
        function(args);
        function(args);
        function(args);
        ...
    }
    
    score_for_actual_function = 10.0 * fastest_time / time_of_actual_function