-2
我想通过使用constexpr
来评估性能差异。我使用下面的代码:constexpr更糟糕的表现?
#include<iostream>
using namespace std;
constexpr double factorial(int n) {
return n==0?1:n*factorial(n-1);
}
main() {
double a=0;
for(int i=0;i<10000000;i++) {
a+=factorial(100);
}
cout<<a<<endl;
}
我尝试了上述程序的两个版本,一个用阶乘功能constexpr
,一个没有。我期望在运行时看到constexpr
版本的性能更好,但实际上运行速度较慢。这里是从每个4次试验的测量(以秒计):
没有constexpr
:
2.691,2.835,2.768,2.748
随着constexpr
:
2.910,2.920,2.903,2.910
有人能解释这背后的原因吗?我是否使用constexpr
错误?我使用g ++ 4.9.1,并使用了O3优化标志。
编辑:代码最初分配的因子为a
。正如评论中所建议的那样,它已被更新以汇总结果。性能差异仍然可见。
甚至在认真考虑这个基准之前的第一件事(虽然在这种情况下可能不适用,因为时间相当长) - 你的循环每次都会做同样的事情。优化器可能只会跳过该工作并执行一次。尝试总和阶乘并输出结果。其次,你可以发布大会吗? –
我无法真正重现您的结果(使用GCC 5.2):http://coliru.stacked-crooked.com/a/407a3aa32caaef9e – melak47
[Without constexpr](https://drive.google.com/file/d/ 0BxcvVB8sWMHJbmxyZzNXdzRiN1U/view?usp = sharing) – SPMP