C++ - 执行速度测试的正确方法是什么?

标签 c++ performance compiler-construction dead-code optimization

我搜索了很多询问相关信息的问题,但答案并不完全符合我想要的答案。我会尽力解释这个问题。

基本上,当在 Release模式下运行代码时,编译器似乎会删除大部分冗余代码或死代码。所以它最终什么都不检查。一些修复是将代码存储到某个变量中,但随后编译只是删除了循环并存储了看起来最后一次递增的内容。

现在我确实希望进行优化以改进所使用的代码,但我仍然想要它最初所做的一切,例如如果我让它循环代码 100,000 次,我希望它实际执行代码 100,000 次。我不确定如何修改 Visual Studio 2010 上的编译器,以便它在 Release模式下编译时进行最少的优化。我非常想为某事准确计时,但我不确定如何为某事准确计时。

起初我认为在不调试的情况下在调试中运行可能会解决这个问题,而且看起来非常好,因为结果与 Java 应用程序的结果相匹配,但是在 Release模式下运行时,结果出奇地快,这让我感到困惑。我不确定 C++ 是否在优化方面做得更好,或者是否更改了大量代码。

有什么办法也可以分解代码并查看 compile 将代码编译成什么?这将是我希望看到的另一个测试,但我对这些东西知之甚少,任何在正确方向上的东西都将不胜感激。好的,感谢任何能够理解我的要求的人。我很乐意回答有关手头问题的任何误解或不确定性的任何问题。

最佳答案

因此,为了避免编译器优化您的所有代码,您需要确保“使用”您在代码中执行的操作的结果。

另一个技巧是将待测代码放在单独的文件中,这样编译器就无法内联您的“函数在文件外部”(除非您启用“整个程序优化”)。

我经常使用函数指针——并不是因为它会阻止优化 [尽管它经常会],而是因为它为我提供了一个很好的基础,可以用相同的基本“测量花费多长时间并打印出结果”来进行多项测试",通过有一张 table ,看起来有点像这样:

 typedef void (*funcptr)(void);

 #define FUNC(f) { f, #f }

 struct func_entry
 {
      funcptr func;
      const char *name;
 };
 func_entry func_table[] = 
 {
      FUNC(baseline),
      FUNC(better1),
      FUNC(worse1),
 };

 void do_benchmark()
 {
     for(int i = 0; i < sizeof(func_table)/sizeof(func_table[0]); i++)
     {
          timestamp t = now();
          func_table[i].func();
          t = now() - t;

          printf("function %s took %8.5fs\n", func_table[i].name, 
                 timestamp_to_seconds(t));
     }
 }

显然,您需要将 now() 替换为一些合适的时间获取函数,将 timestamp 替换为该函数的相关类型,并将 timestamp_to_seconds 一些有用的东西......

关于C++ - 执行速度测试的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14679105/

相关文章:

python - 为什么 Python 3 中不再提供编译器包?

c++ - 错误 PRJ0019 : A tool returned an error code from "moc' ing qt/gui/QFloatSlider. h

c++ - 如何将 Windows 命令提示符命令的结果存储到文件中?

php - 我的代码搜索真的很慢

c - 提高 SQLite 的每秒插入性能

php - 在项目级别而不是文件级别检查 php 中的语法错误

android - 在实际手机上编译 Android 应用程序

c++ - OpenGL VC++ 初学者中的 gluProject() 设置

c++ - 如何在C++中读取二进制图像(tif)?

performance - Docker 的调试和实验标志对性能有影响吗?