2015-11-26 116 views
-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。正如评论中所建议的那样,它已被更新以汇总结果。性能差异仍然可见。

+0

甚至在认真考虑这个基准之前的第一件事(虽然在这种情况下可能不适用,因为时间相当长) - 你的循环每次都会做同样的事情。优化器可能只会跳过该工作并执行一次。尝试总和阶乘并输出结果。其次,你可以发布大会吗? –

+0

我无法真正重现您的结果(使用GCC 5.2):http://coliru.stacked-crooked.com/a/407a3aa32caaef9e – melak47

+0

[Without constexpr](https://drive.google.com/file/d/ 0BxcvVB8sWMHJbmxyZzNXdzRiN1U/view?usp = sharing) – SPMP

回答

1

constexpr当计算在编译时完成时是有利的。但是,编译器不需要这样做,除非您需要,例如,通过编制aconstexpr。在运行时constexpr对功能没有影响。

如我所料,我在测试中得到非常接近的结果(增量为〜0.1s)。