在发布模式下测量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使用了预测流水线,并且在未来的迭代中对函数进行了一半处理。这很难说,但如果你想获得一个真正的运行时间,是否可以在第一次迭代中使用伪参数调用函数并丢弃结果?
相关文章:
- 方法内部但循环仍得到预期的不合格id错误C++
- 在 c++ 中实现嵌套循环的更短方法吗?
- 如何在C++中循环访问未知对象方法?
- EnQueue 方法在循环队列中未正确返回C++?
- C++模板方法中的循环依赖关系
- 为什么这种方法会进入无限循环?
- 编写按初始值循环的循环的更好方法是什么
- 循环遍历标准的正确方法::array<char*, N>
- 类方法 - 数据结构中 For 循环的运行时错误
- 循环依赖,在继承类的情况下使用覆盖方法
- 从列表/向量制作嵌套 for 循环的最佳方法是什么?
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 是否可以在基于范围的 for 循环中使用模板化的开始/结束方法
- 还有其他方法可以为乘法表编写循环以获取运行时值吗?
- 如何避免模板方法的循环依赖
- 使用虚拟变量对 std::vector 内部循环进行切片的最佳方法
- 有什么方法可以在 c++ 中组织"cycling"(循环)数字?
- 我应该避免在循环中重复访问相同的方法吗?
- 遍历 STL 映射(集/多集)的最佳方法,同时元素可能会在循环期间被删除并重新插入?
- 在 C 中并行化嵌套循环的几种方法之间的差异,C++使用 OpenMP