看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《hichcock (快樂一整年 ^^~~~)》之銘言: : 前一陣子正好在寫一個高運算量的演算法 : 裡面大部分需要用到的是正整數 : 所以我就全部使用 UINT 來宣告 : 當時的想法是 UINT 應該比 int 的運算來的快 : 因為不需要辨識正負數的問題 : 不過最後當整個演算法完成後 : 我一時興起將全部的 UINT 又改成 int : 卻發現效率比原本的快上 1 倍 !? : 這點我無法理解,不知道有人知道原因嗎? : 我使用的是 VC 6.0 下面是一個簡單的範例: 1. 使用 UINT 運算 #define Number 9999 UINT *Data = new UINT[Number]; UINT i, j, k; double Q2 = sqrt(2); UINT Tm = GetTickCount(); for(i = 0;i < Number;i++) { k = 0; for(j = 0;j < Number;j++) { k = k + UINT(Q2*i); } Data[i] = k; } TRACE("UINT : %d\n", GetTickCount()-Tm); delete Data; 2. 使用 int 運算 #define Number 9999 int *Data = new int[Number]; int i, j, k; double Q2 = sqrt(2); UINT Tm = GetTickCount(); for(i = 0;i < Number;i++) { k = 0; for(j = 0;j < Number;j++) { k = k + int(Q2*i); } Data[i] = k; } TRACE("int : %d\n", GetTickCount()-Tm); delete Data; 這兩段程式在我的電腦跑就差了快 5 秒了 我問過一些較資深的同事,似乎沒有人確定原因 後來我又實驗了一下,似乎是在強制轉型那邊的差異 double -> int 比較快 double -> UINT 比較慢 有強者可以解說一下嗎 -- 每一個偉大的故事,都不會在一瞬間就發生,它總是透過一個個小小的奇蹟累積而來 至於今晚的比賽究竟誰會獲勝,事實上每一場比賽都一樣 如果今晚你有非贏不可的理由,那你就.....一定會贏 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.250.142.11
lockcole:如果code改成不用轉型,速度就會一樣嗎? 03/02 17:25
zlw:http://tinyurl.com/ap9a57 代碼優化-之-優化浮點數取整 03/02 17:47
zlw:這篇可能有關,不過看不懂 03/02 17:48
chrisdar:double->signed 有號轉有號 double->unsigned 有號轉無號 03/02 18:05
chrisdar:應該是 有號互轉比較快 與 unsigned/signed int 沒關係 03/02 18:06
ledia:disassembly 看起來是下面用了 SSE inst. 所以比較快 03/02 18:20
VictorTom:同樓上, 看起來不用小弟雞婆貼disasm code了....:) 03/02 18:22
VictorTom:話說, 一時找不到怎麼把ins set最佳化給關掉了Orz 03/02 18:24
tinlans:我用 g++ -O3 編,連 0.01 秒都沒差。 03/02 18:40
k2450:還蠻好奇是都比VC快還是都比VC慢 03/02 21:36