[問題] C的compiler處理非Optimize效能的疑問

看板C_and_CPP (C/C++)作者 (瘋狂上班族~~)時間14年前 (2011/10/14 23:24), 編輯推噓6(6020)
留言26則, 9人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 我這邊寫了很簡單的迴圈來計算sin(),在optimize disable 的情況下發生一個我不能理解的事情。 D1 = timeGetTime(); for ( int i = 0; i < 35000000; i++ ) { temp = sin( M_PI * 0.38 ); } D1 = timeGetTime() - D1; printf( "D1: %d \n", D1 ); D2 = timeGetTime(); float value = M_PI * 0.38f; for ( int i = 0; i < 35000000; i++ ) { temp = sin( value ); } D2 = timeGetTime() - D2; printf( "D2: %d", D2 ); 結果是D1的時間花的比較少...我不是很理解。但如果把Optimize打開之後,D2的時間 就比較少了。這是為什麼? 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 不好意思,這是小弟第一次在此板PO文,如有不禮貌請多多指教: 我的code是在VC環境下編譯,所以有使用windows.h的header。 在此附上原始碼,煩請高手予以指教。 http://codepad.org/ehRQvsZs 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.115.180.122

10/15 00:51, , 1F
M_PI型態是? 是普通var還是const還是#define出來的?
10/15 00:51, 1F

10/15 00:53, , 2F
#define M_PI 3.141592653589793238462643
10/15 00:53, 2F

10/15 00:58, , 3F
fmul VS MOV
10/15 00:58, 3F

10/15 00:58, , 4F
想一想, 可能所有的變數型態都要....Orz
10/15 00:58, 4F

10/15 00:59, , 5F
建議原po利用置底文網站,貼上完整到能讓板友跑的程式碼
10/15 00:59, 5F

10/15 01:01, , 6F
推樓上j大, 變數都要猜, 然後code還build不過Q_Q~
10/15 01:01, 6F

10/15 01:02, , 7F
其實這種不清不楚的文章,我就不會深入研究了...XD
10/15 01:02, 7F

10/15 01:03, , 8F
我猜是因為第一個裡面的數字是常數相乘,編譯會先算出
10/15 01:03, 8F

10/15 01:04, , 9F
例如宣告 int a[2*2]; 編譯器會當你宣告是int a[4];
10/15 01:04, 9F
※ 編輯: GhostMonkey 來自: 59.115.180.122 (10/15 01:30)

10/15 01:39, , 10F
如果是使用Release環境,結果就如同我所設想
10/15 01:39, 10F

10/15 01:44, , 11F
我剛剛把一式中的sin傳入參數,casting成float,
10/15 01:44, 11F

10/15 01:47, , 12F
二式就會比一式快了,看來在debug環境,傳double較快
10/15 01:47, 12F

10/15 01:49, , 13F
都忘了原po二式是用float傳進去的,的確該考慮gpu.
10/15 01:49, 13F

10/15 10:03, , 14F
結果還是沒有M_PI的定義....Orz
10/15 10:03, 14F

10/15 10:04, , 15F
如果M_PI是const過#define, 其實我會以為opt一開一式才
10/15 10:04, 15F

10/15 10:04, , 16F
應該比較快, 因為整個sin有機會在compile time就算出常
10/15 10:04, 16F

10/15 10:05, , 17F
數來assign了. 不過opt compiler能做的也很多就是了XD
10/15 10:05, 17F

10/15 10:11, , 18F
#define M_PI 3.14159265358979323846
10/15 10:11, 18F

10/15 14:49, , 19F
@V 大 : M_PI 是 macro, 通常被定義在math.h 裡面,一
10/15 14:49, 19F

10/15 14:50, , 20F
般直接含header.h即可用,只是 vs 比較麻煩, 必須先
10/15 14:50, 20F

10/15 14:50, , 21F
#define _USE_MATH_DEFINES 才可啟用,裡面有一些常數.
10/15 14:50, 21F

10/15 16:16, , 22F
啊抱歉, 那小弟我懂了; 所以2F cutecpu大就回過了Orz
10/15 16:16, 22F

10/15 16:16, , 23F
平常要用PI都是自己define, 沒注意到math.h裡有Orz
10/15 16:16, 23F

10/15 22:08, , 24F
是c99才有的,早期的書確實很少提到(新書也不多提吧..)
10/15 22:08, 24F

10/16 03:10, , 25F
M_PI 不是 C99 而是 POSIX 標準
10/16 03:10, 25F

10/16 22:12, , 26F
謝謝樓上指正。
10/16 22:12, 26F
文章代碼(AID): #1Ec5GONu (C_and_CPP)
文章代碼(AID): #1Ec5GONu (C_and_CPP)