我需要計算浮點數的平方多次(到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