【发布时间】:2018-03-27 17:48:32
【问题描述】:
每当处理特定问题时,我可能会遇到不同的解决方案。我不确定如何选择两个选项中的更好的。第一个想法是计算两个解决方案的复杂度,但有时它们可能具有相同的复杂度,或者它们可能不同但输入的范围很小,常数因子很重要。
第二个想法是对两种解决方案进行基准测试。但是,我不确定如何使用 c++ 为它们计时。我发现了这个问题: How to Calculate Execution Time of a Code Snippet in C++ ,但我不知道如何正确处理编译器优化或处理器不一致。
简而言之:上述问题中提供的代码是否足以进行日常测试?在运行测试之前,我应该在编译器中启用一些选项吗? (我使用的是 Visual C++)我应该做多少测试,两个基准测试之间的时间差有多大?
这是我要测试的代码示例。其中哪个更快?我自己怎么计算?
unsigned long long fiborecursion(int rank){
if (rank == 0) return 1;
else if (rank < 0) return 0;
return fiborecursion(rank-1) + fiborecursion(rank-2);
}
double sq5 = sqrt(5);
unsigned long long fiboconstant(int rank){
return pow((1 + sq5) / 2, rank + 1) / sq5 + 0.5;
}
【问题讨论】:
-
可以说的是,您必须在打开编译器优化的情况下测试您的真实代码。否则,您将测试未优化的代码,并且您不会得到有用的结果。如果您测试人工代码,您可能会冒编译器优化所有内容或重要部分的风险。
-
This response 来自您链接的问题会很好。构建优化的代码,选择足够大的样本量,进行多次运行并平均执行时间。
-
如何启用所有优化? “足够大的样本量”是多少?
-
您必须添加优化标志 -O1 用于大小和 -O2 用于速度并使用 big int
fiborecursion(1000000)或 `fuborrvursion(100000000L) 测试您的功能 -
在互联网上搜索“如何对 C++ 程序进行基准测试”。关键字是benchmarking。
标签: c++ benchmarking