chrono high_resolution_clock给出了不一致的时间?

时间:2017-01-22 20:18:59

标签: c++ chrono

所以我有一个程序以两种不同的方式评估多项式:Honrer的方法和Naive方法。我试图分别查看它们的运行时间,但根据我放置函数调用的顺序,它们的时间会发生变化。例如,我首先放置Horner方法并且需要更长时间。然后我先尝试使用天真的方法,然后花费更长的时间。 Horner方法应该快得多,因为它只有一个循环,其中naive方法有一个嵌套循环。所以我认为它必须是我使用计时库中的时钟的方式。我尝试了high_resolution_clock和system_clock,但同样的事情发生了。欢迎任何帮助/评论。

#include <cstdlib>
#include <iostream>
#include <chrono>
#include "Polynomial.h"

int main(int argc, char** argv) {

  double c[5] = {5, 0, -3, 1, -8};
  int degree = 4;
  Polynomial obj(c, degree);

  auto start = std::chrono::high_resolution_clock::now();

  std::cout<<"Horner Evaluation: " << obj.hornerEval(-2)<<",  ";

  auto elapsed = std::chrono::high_resolution_clock::now() - start;
  auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(elapsed).count();
  std::cout<< duration << " nanoseconds "<<std::endl;


  auto start2 = std::chrono::high_resolution_clock::now();

  std::cout<<"Naive Evaluation: " << obj.naiveEval(-2)<<", ";

  auto elapsed2 = std::chrono::high_resolution_clock::now() - start2;
  auto duration2 = std::chrono::duration_cast<std::chrono::nanoseconds>(elapsed2).count();

  std::cout<< duration2 << " nanoseconds "<<std::endl; 
}

2 个答案:

答案 0 :(得分:2)

您没有放入所有代码,但从描述中看起来它是缓存效果。 当它运行第一个方法CPU缓存是冷的(来自内存的数据尚未填充CPU缓存)所以它需要更多的时间来处理(与缓存相比,内存很慢)。 调用第二个方法时,它具有所有(或大多数取决于数据大小)缓存中已有的数据 - 缓存很热。

解决方案 - 首先在时间部分之外调用两种方法来预热缓存而不是测量。

答案 1 :(得分:0)

就像前面已经说过的响应中的一个,它可能是缓存的一部分,预取器可以更好地确定在naiveEval方法中加载到缓存中的内存。下面是关于基准c ++代码的讨论,以获取有关冷启动对基准测试的影响的更多信息:https://www.youtube.com/watch?v=zWxSZcpeS8Q