2010-09-24 109 views
1

我想犯罪的功能。所以這裏是我的代碼:三角函數

inline double _cdecl Sin(double Rad) 
{ 
    _asm 
    { 
     fld QWORD PTR [Rad] 
     fsin 
    } 
} 

我的func比標準的罪更快地工作(比例約爲6)。 (有可能是在它的一些問題,但它足以讓我) 但如果我會如做

for(int i = 0; i < 1000000; ++i) 
     sin(1) 

標準的罪會更快約3 的比例,如果我會做

for(int i = 0; i < 1000000; ++i) 
     sin(i) 

我FUNC會更快約3 比這裏發生了什麼?

+0

什麼編譯器,並且正在調試啓用? – Dandy 2010-09-26 06:03:03

回答

3

編譯器可能知道sin(1)是一個沒有副作用的內在純函數,因此甚至不會在循環內調用它。所以你最終可能只是對循環進行計時。使用合適的編譯器開關檢查生成的彙編代碼以獲取彙編輸出。

+0

+1注意優化。由於'sin(1)'的參數是不變的,所以程序不需要多次調用它,所以編譯器可以用一個函數調用代替循環。另外,由於沒有使用返回值,因此編譯器可能會拋出單個函數調用。 – 2010-09-24 17:59:00

+0

我相信gcc可以在編譯時評估一次。 – phkahler 2010-09-27 16:53:20

0

編譯器是不是會用標準的sin來更好地優化第一個版本並檢測它是一個常量?