2013-03-11 56 views
1

我需要计算浮点数的平方多次(到10^8级)pow(num,2)的效率?

哪个更好(因为时间是一个巨大的约束):

pdt=pow(num,2); 

     OR 

pdt=num*num 

或者他们真的一样吗?

编辑:当在合理的大输入上检查两种样式时,我的处理器给出了矛盾的结果。

+6

配置文件,看看。 – juanchopanza 2013-03-11 22:59:10

+0

分享您用于分析的程序,编译器可能完全优化了计算。 – 2013-03-11 23:02:29

+0

“矛盾的结果”是什么意思? – Xymostech 2013-03-11 23:02:37

回答

10

num*num将至少一样快pow(num, 2)任何非不正当C/C++实现方式中,因为没有实施pow不具有至少一个浮点乘法或更费时的操作。

6

在没有optmisations的情况下使用gcc num * num会更快,因为pow会引发函数调用。在-O2他们输出相同的asm(对于x86):

float numpow(float x){ 
    return pow(x, 2); 
} 

float mulpow(float x){ 
    return x*x; 
} 

compiled with g++ -S -O2 -c 

__Z6numpowf: 
Leh_func_begin1: 
    pushq %rbp 
Ltmp0: 
    movq %rsp, %rbp 
Ltmp1: 
    mulss %xmm0, %xmm0 
    popq %rbp 
    ret 
Leh_func_end1: 

... 
__Z6mulpowf: 
Leh_func_begin2: 
    pushq %rbp 
Ltmp2: 
    movq %rsp, %rbp 
Ltmp3: 
    mulss %xmm0, %xmm0 
    popq %rbp 
    ret 
+0

是的,gcc实现'pow'和其他数学函数作为编译器内在函数,所以这是可以预料的(当使用gdb进行调试时也会产生有趣的效果)。 – Voo 2013-03-11 23:07:20