2013-03-11 43 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