Re: [問題] int & UINT 效率比

看板C_and_CPP作者 (快樂一整年 ^^~~~)時間15年前 (2009/03/02 17:01), 編輯推噓7(703)
留言10則, 7人參與, 最新討論串2/2 (看更多)
※ 引述《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

03/02 17:25, , 1F
如果code改成不用轉型,速度就會一樣嗎?
03/02 17:25, 1F

03/02 17:47, , 2F
http://tinyurl.com/ap9a57 代碼優化-之-優化浮點數取整
03/02 17:47, 2F

03/02 17:48, , 3F
這篇可能有關,不過看不懂
03/02 17:48, 3F

03/02 18:05, , 4F
double->signed 有號轉有號 double->unsigned 有號轉無號
03/02 18:05, 4F

03/02 18:06, , 5F
應該是 有號互轉比較快 與 unsigned/signed int 沒關係
03/02 18:06, 5F

03/02 18:20, , 6F
disassembly 看起來是下面用了 SSE inst. 所以比較快
03/02 18:20, 6F

03/02 18:22, , 7F
同樓上, 看起來不用小弟雞婆貼disasm code了....:)
03/02 18:22, 7F

03/02 18:24, , 8F
話說, 一時找不到怎麼把ins set最佳化給關掉了Orz
03/02 18:24, 8F

03/02 18:40, , 9F
我用 g++ -O3 編,連 0.01 秒都沒差。
03/02 18:40, 9F

03/02 21:36, , 10F
還蠻好奇是都比VC快還是都比VC慢
03/02 21:36, 10F
文章代碼(AID): #19gw1MfM (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #19gw1MfM (C_and_CPP)