【问题标题】:c++ timing same loop gives different resultsc++时间相同的循环给出不同的结果
【发布时间】:2018-12-01 23:16:02
【问题描述】:

有人能解释为什么多次运行这段代码会得到非常多变的结果吗? 除非我做错了什么,否则它应该测量我的系统(MacOSX Sierra,Xcoe9.2)运行空 for 循环 1000 次所需的时间。

#include <iostream>
#include <chrono>

void printstuff (){
    for (int i = 0; i < 1000; ++i){
    //empty loop
    }
}

int main(int argc, const char * argv[]) {

    auto time1 = std::chrono::high_resolution_clock::now();
    printstuff();
    auto time2 = std::chrono::high_resolution_clock::now();

    std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(time2 - time1).count() << std::endl;

    return 0;
}

【问题讨论】:

  • 如果你想测量时间,你应该测量最后没有优化掉的东西。
  • 您能否详细说明“最后测量的东西没有被优化掉”?
  • 就是答案。编译器删除空循环。这种检测的配置文件还有其他问题。使用 perf、papi 或 vtune(我认为现在免费)。

标签: c++ timing chrono


【解决方案1】:

您是如何编译该代码的?您使用的是哪些标志?

如果您正在使用任何级别的优化(使用优化标志之一,例如:https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html 用于 gcc),那么函数 printstuff() 将编译为零指令,如您在此处看到的:https://godbolt.org/z/gXq-mG

如果您没有使用任何优化标志,那么该循环仍然会执行得太快,以至于您无法测量任何东西(您很可能正在测量噪声)。

如果你想对代码进行基准测试,我会推荐你​​Google Benchmark

【讨论】:

  • 我正在学习 c++,我只是想检查将 printstuff 声明为“内联”时的时间差异。看起来我缺少一些关于优化标志的细节。我会看看您发布的链接。
  • 如果我添加 std::cout
  • 如果添加它,那么您将测量打印 0 一千次所需的时间。正如我所建议的,Google Benchmark 是一个非常好的库,可以对您的代码进行基准测试。
猜你喜欢
  • 1970-01-01
  • 2019-02-06
  • 2019-10-20
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多