我需要计算浮点数的平方多次(到10^8级)pow(num,2)的效率?
哪个更好(因为时间是一个巨大的约束):
pdt=pow(num,2);
OR
pdt=num*num
或者他们真的一样吗?
编辑:当在合理的大输入上检查两种样式时,我的处理器给出了矛盾的结果。
我需要计算浮点数的平方多次(到10^8级)pow(num,2)的效率?
哪个更好(因为时间是一个巨大的约束):
pdt=pow(num,2);
OR
pdt=num*num
或者他们真的一样吗?
编辑:当在合理的大输入上检查两种样式时,我的处理器给出了矛盾的结果。
num*num
将至少一样快pow(num, 2)
任何非不正当C/C++实现方式中,因为没有实施pow
不具有至少一个浮点乘法或更费时的操作。
在没有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
是的,gcc实现'pow'和其他数学函数作为编译器内在函数,所以这是可以预料的(当使用gdb进行调试时也会产生有趣的效果)。 – Voo 2013-03-11 23:07:20
配置文件,看看。 – juanchopanza 2013-03-11 22:59:10
分享您用于分析的程序,编译器可能完全优化了计算。 – 2013-03-11 23:02:29
“矛盾的结果”是什么意思? – Xymostech 2013-03-11 23:02:37