在发布模式下测量Visual Studio(C++)中循环内方法的运行时时出错

Error in measuring runtime of a method inside a loop in Visual Studio (C++) in release mode

本文关键字:方法 循环 出错 运行时 C++ Visual 布模式 模式 测量 Studio      更新时间:2023-10-16

我有一个名为function的方法(见下文),它有两个输入:一个图像和一个整数,这是函数对图像进行一些操作的指令。因此,每个数字都意味着不同的运算。

for(int i=0;i<8;i++){
     auto start = std::chrono::high_resolution_clock::now();
     function(image, i);
     auto elapsed = std::chrono::high_resolution_clock::now() - start;
     long long microseconds =std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count();
     cout << "i=" << i << ", time=" << microseconds << " micro seconds" << "  or "<<microseconds/(long double)1000000<<" seconds"<<"n";
    }

这是程序的输出:

i=0, time=357586 micro seconds  or 0.357586 seconds
i=1, time=15624 micro seconds  or 0.015624 seconds
i=2, time=15624 micro seconds  or 0.015624 seconds
i=3, time=15625 micro seconds  or 0.015625 seconds
i=4, time=15626 micro seconds  or 0.015626 seconds
i=5, time=15624 micro seconds  or 0.015624 seconds
i=6, time=15624 micro seconds  or 0.015624 seconds
i=7, time=15625 micro seconds  or 0.015625 seconds

然而,如果我改变指令1和0的顺序,我会得到以下内容:

i=1, time=348474 micro seconds  or 0.348474 seconds
i=0, time=15625 micro seconds  or 0.015625 seconds
i=2, time=15612 micro seconds  or 0.015612 seconds
i=3, time=15625 micro seconds  or 0.015625 seconds
i=4, time=15625 micro seconds  or 0.015625 seconds
i=5, time=15625 micro seconds  or 0.015625 seconds
i=6, time=15625 micro seconds  or 0.015625 seconds
i=7, time=15625 micro seconds  or 0.015625 seconds

换句话说,无论操作类型如何,函数的第一次调用总是需要更多的时间。如何解决此问题?我的目标是比较不同操作的运行时,然后丢弃那些耗时的操作。

尝试在循环中全局声明所有变量,而不是局部声明,这可能需要时间。我想,在它将变量设置到寄存器中后,它会重新使用它们,所以这就是为什么你会看到初始时间尖峰。然而,优化的时间也有可能是因为函数指针也已经在寄存器中设置好了,并且每次只向其中传递一个新参数。据我所知,这是因为你的CPU使用了预测流水线,并且在未来的迭代中对函数进行了一半处理。这很难说,但如果你想获得一个真正的运行时间,是否可以在第一次迭代中使用伪参数调用函数并丢弃结果?