我搜索了很多询问相关信息的问题,但答案并不完全符合我想要的答案。我会尽力解释这个问题。
基本上,当在 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/