[問題] 程式執行時間

看板C_and_CPP (C/C++)作者 (麵T)時間12年前 (2013/02/10 21:58), 編輯推噓1(1018)
留言19則, 7人參與, 最新討論串3/3 (看更多)
開發平台(Platform): Dev C++ 不論用 clock() 或者用 QueryPerformanceCounter(), 在時間計算上會出現「空迴圈」比「運算迴圈」還更花時間的現象, 想不透為什麼如此奇怪。 空迴圈執行結果:平均時間3.5589秒 運算迴圈(q=p*2;)執行結果:平均時間3.1942秒 程式碼:http://ideone.com/Y63MJt 期望運算結果:運算迴圈時間大於空迴圈時間 -- 我是麵T,哩賀 http://ppt.cc/-eS5 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.121.37.187

02/10 22:00, , 1F
有考慮直接打N次的 q=p*2;,但 Compiler 會當掉
02/10 22:00, 1F

02/10 22:47, , 2F
應該是沒有data dependence所以被最佳掉了,後面印個q
02/10 22:47, 2F

02/10 22:48, , 3F
試試
02/10 22:48, 3F

02/10 23:03, , 4F
加上印q後平均執行時間3.1929依然比空迴圈少
02/10 23:03, 4F

02/11 00:47, , 5F
你的p是常數,被最佳化了,改用i試試
02/11 00:47, 5F

02/11 01:45, , 6F
改成q=i*2結果也是一樣
02/11 01:45, 6F

02/11 02:15, , 7F
運算改用加? q一下就 int 的大小, 可能被最佳化掉了吧
02/11 02:15, 7F

02/11 02:18, , 8F
q += i;
02/11 02:18, 8F

02/11 02:25, , 9F
這是 locality 的問題,跟最佳化無關。
02/11 02:25, 9F

02/11 02:27, , 10F
如果要看有沒有被最佳化影響到,可以開 Disassembly 來看
02/11 02:27, 10F

02/11 02:33, , 11F
如果你想擺脫 locality 的夢魘的話,
02/11 02:33, 11F

02/11 02:34, , 12F
可以把 i 宣告成 register unsigned int i;
02/11 02:34, 12F

02/11 08:00, , 13F
空迴圈是指回圈內不執行q=p*2嗎? 結果看起來很正常啊
02/11 08:00, 13F

02/11 14:15, , 14F
空迴圈是不執行q=p*2沒錯。很正常s是指?
02/11 14:15, 14F

02/11 19:45, , 15F
i加了register後,整個程式變快好多而且是否是空迴圈也明
02/11 19:45, 15F

02/11 19:47, , 16F
顯許多,不過register只加再n、p、q就沒什麼明顯效果
02/11 19:47, 16F

02/11 19:49, , 17F
很好奇為什麼會這樣? linotwo大真是厲害 m(_ _)m
02/11 19:49, 17F

02/11 22:03, , 18F
我是用vc2008, 不執行q=p*2速度有比較快,
02/11 22:03, 18F

02/11 22:04, , 19F
編譯方式是在命令列用cl編譯,沒有特別設定其他參數
02/11 22:04, 19F
文章代碼(AID): #1H5wU0OD (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1H5wU0OD (C_and_CPP)