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

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

我有一个名为 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 使用了预测流水线,并在未来的迭代中中途处理了该函数。很难说,但如果你想得到一个真实的 运行 时间,是否可以在第一次迭代时使用虚拟参数调用你的函数并丢弃结果?