2013-04-08 59 views
1

用g ++編譯這個函數可行,但速度很慢。爲什麼我在這些功能之間看到如此巨大的性能差異?

void rota(double psir,double thetar,double phir,double xi,double yi,double zi,double *xf,double *yf,double *zf) { 
    *xf = xi*cos(phir)*cos(psir)+yi*(-sin(phir)*cos(thetar)*cos(psir)+sin(thetar)*sin(psir))+zi*(sin(phir)*sin(thetar)*cos(psir)+cos(thetar)*sin(psir)); 
    *yf = xi*sin(phir)+yi*cos(phir)*cos(thetar)-zi*cos(phir)*sin(thetar); 
    *zf = -xi*cos(phir)*sin(psir)+yi*(sin(thetar)*cos(psir)+cos(thetar)*sin(phir)*sin(psir))+zi*(cos(thetar)*cos(psir)-sin(thetar)*sin(phir)*sin(psir)); 
    return; 
} 

如果我計算,一旦中間值,然後調用這些,我的模擬運行更快。

void rota(double psir,double thetar,double phir,double xi,double yi,double zi,double *xf,double *yf,double *zf) { 
    double cosf = cos(phir); 
    double sinf = sin(phir); 
    double cosp = cos(psir); 
    double sinp = sin(psir); 
    double cost = cos(thetar); 
    double sint = sin(thetar); 
    *xf = xi*cosf*cosp+yi*(-sinf*cost*cosp+sint*sinp)+zi*(sinf*sint*cosp+cost*sinp); 
    *yf = xi*sinf+yi*cosf*cost-zi*cosf*sint; 
    *zf = -xi*cosf*sinp+yi*(sint*cosp+cost*sinf*sinp)+zi*(cost*cosp-sint*sinf*sinp); 
    return; 
} 

爲什麼g ++沒有爲我做這個優化?有沒有辦法讓我更有效地做到這一點?

謝謝!

+3

您是否設置了最大優化級別? – 2013-04-08 17:55:41

+0

嘗試使用#include 而不是#include 並使用std命名空間調用函數,例如std :: cos等。 – 2013-04-08 18:02:34

+0

@GearoidMurphy - 我無法想象爲什麼這很重要,但我開明。你見過這樣的區別嗎? – 2013-04-08 18:04:25

回答

3

我使用gcc 4.7.2-O3編譯了你的代碼。生成的x86_64程序集在兩種情況下幾乎相同。

然後我通過調用100,000,000次來測試每個函數的基準。

的第一個版本了:

real 0m0.216s 
user 0m0.213s 
sys  0m0.002s 

而第二把:

real 0m0.216s 
user 0m0.212s 
sys  0m0.002s 

得出自己的結論。

+1

0.001秒的差異?對於一臺電腦,這是一個永恆! ;) – 2013-04-08 18:25:34

+1

@NikBougalis:大聲笑 - 這是一個了不起的結論,謝謝:) – NPE 2013-04-08 18:30:48

+0

真棒,謝謝@NPE!我在努力學習更多,但我的谷歌功能很弱。 -O3標誌是做什麼的?我知道它是Optimize,但爲什麼是3?在那裏使用不同的參數是否有穩定/性能的原因? – 2013-04-08 18:56:07

相關問題