【问题标题】:Chrono high_resolution_clock giving inconsistent times?Chrono high_resolution_clock 给出不一致的时间?
【发布时间】:2017-01-23 04:55:20
【问题描述】:

所以我有一个程序以两种不同的方式计算多项式:Honrer 方法和 Naive 方法。我试图分别查看它们的运行时间,但取决于我放置函数的顺序,它们的时间会发生变化。比如我把Horner方法放在第一位,耗时比较长。然后我先尝试了天真的方法,然后它需要更长的时间。 Horner 方法应该快得多,因为它只有一个循环,而朴素方法有一个嵌套循环。所以我认为这一定是我使用 chrono 库中的时钟的方式。我尝试了 high_resolution_clock 和 system_clock,但同样的事情发生了。欢迎任何帮助/cmets。

#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; 
}

【问题讨论】:

  • 我宁愿怀疑std::cout 花费了大量时间。您不应在测量中包含 I/O 时间。
  • 1) 确保您启用了优化。 2) 运行每个基准测试几千次。 3) 确保你的基准测试中没有包含标准输出时间。
  • 我相信它做到了......在取出 i/o 后,它们都运行得更快。谢谢。
  • 还有我通常使用std::chrono::steady_clock
  • 计算机非常非常非常非常非常复杂。看来你忘了把它考虑进去!我们不再开发带有打孔卡的机械机器了。

标签: c++ chrono


【解决方案1】:

你没有放所有的代码,但从描述来看,它看起来是缓存效果。 当它运行第一种方法时,CPU 缓存是冷的(内存中的数据尚未填充 CPU 缓存),因此需要更多时间来处理(内存比缓存慢)。 当调用第二种方法时,它拥有所有(或大部分取决于数据大小)缓存中已经可用的数据 - 缓存很热。

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

【讨论】:

  • 通常你应该运行它至少数千次,然后扔掉前一百次左右才能得到真正的测量
  • 在这种情况下它会起作用,但它不是通用的解决方案 - 如果每一轮都引用不同的内存地址,它将显示相同的“方法调用时间依赖性”效果。
  • 这就是我认为可能会发生的事情,但我还不够精明,无法将其转化为技术术语哈哈。是的,我相信我的教授说过类似的话。谢谢!
【解决方案2】:

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

【讨论】:

  • 啊,我明白了。谢谢!
猜你喜欢
  • 2017-08-31
  • 2014-03-23
  • 2015-05-14
  • 1970-01-01
  • 2017-09-02
  • 2017-11-25
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
相关资源
最近更新 更多