慢速 for 循环,时序不一致

Slow for loop with inconsistent timing

本文关键字:不一致 for 循环 慢速      更新时间:2023-10-16

我有一个大约这样的 for 循环:

Timer timer1, timer2;
double inner_loop_time = 0;
timer1.Reset()
for (int i = 0; i < num_steps; i++) {
  timer2.Reset();
  sample_point += delta;
  // Find some points close to the sample_point.
  std::vector<int> point;
  FindClosestPoints(sample_point, &new_keypoints);
  // Insert the keypoints into a global container.
  candidate_keypoints.insert(new_keypoints.begin(),
                             new_keypoints.end());
  inner_loop_time += timer2.ElapsedTimeInSeconds();
}
const double outer_loop_time = timer1.ElapsedTimeInSeconds();
std::cout << "Inner loop time: " << inner_loop_time 
          << " vs outer loop time: " << outer_loop_timer;

当我运行此代码时,我在内部循环和外部循环中的计时之间出现明显的不一致。 例如,外循环报告 0.96 秒,内循环报告 0.51 秒。为什么这些时间不一致?

其他注意事项:

  • Timer 类是 c++11 时间库的包装器。这是有效的,而不是时间差异的原因。
  • 函数 FindClosestPoints 是自包含的,不会生成任何线程。
  • 这种奇怪的计时行为在数千次运行中是一致的。
  • num_steps大约 1000
inner_loop_time不包括

摧毁std::vector<int> point的时间或在timer2.Reset()内花费的时间。

取决于num_steps .每个循环周期都会在两个计时器之间产生很小的差异。因为重置内部计时器和计算经过的时间之间存在差距。

时差应该是成比例的。你可以用

diff = num_steps * gap_time