Re: [問題] 面試考題 程式最佳化
※ 引述《littleshan (我要加入劍道社!)》之銘言:
: 注意 a/24 > b 不可以改成 a > b*24 或 a/8 > b*2+b
: 因為 b 在乘法運算後可能溢位,導致比較結果不正確
除了溢位問題以外,可能還有以下幾個常見問題:
(1) 沒有人保證 unsigned (int) 寬度剛好是 32 位元,要玩弄位元請用 uint32_t.
C99 標準(草稿 n1256 版)只有說 UINT_MAX 至少是 65535 (2^16-1).
目前流行的的編譯器+作業系統+處理器(LP64/LLP64 資料模型)int 都用 32
位元沒錯,但別忘了以前 16 位元橫行的時代恐怕只有 16 位元,而比較不流行
模型中可能也只有 16 位元。誰知道以後趨勢會不會又改了呢?ILP64 中 int 是
64 位元,而且也有人用。
(2) 整數除法問題。25/24 > 1 不成立,但 25 > 1*24 成立。就算沒溢位也錯。
: 結論:除非這家公司只能用特定平台的老舊 compiler,或是自己就在寫 compiler
: 否則他們的 code 可能充滿 << >> 之類的位元運算,
: 不但沒比較快,還要小心莫名奇妙的 bug
: 建議原 po 仔細考慮一下再決定要不要去
非常同意結論!莫名其妙的 bug 包括未來資料模型一改(例如 ILP128 xD)可能馬上
又要重寫了。現在常見的編譯器一定會做一些基本的最佳化,實在沒必要為了這種東西花
時間,甚至讓程式碼更難讀懂...。
===
講一些比較有建設性的東西好了。Hacker's Delight 這本書有很多使用位元運算技巧
的程式碼可以參考。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.39
→
06/16 03:03, , 1F
06/16 03:03, 1F
「理論上」沒有任何關係;「實際上」在 AMD64 架構下,在 Windows 和大部分 *nix 中
常見的編譯器(好繞口)裡面的 int 都是 32 位元。「通常」只寫幾位元是代表指標、暫存器
等等有幾位元,是一個用來粗略描述處理器架構的一個方法,而不是 int 佔幾位元。不過這也
只是「通常」而已...
→
06/16 03:03, , 2F
06/16 03:03, 2F
→
06/16 03:04, , 3F
06/16 03:04, 3F
恐怕 int 原本就跟處理器的能力沒有直接關係,不過你說 gcc 跟進是指?你用的處理器
架構和作業系統是什麼呢?
→
06/16 03:14, , 4F
06/16 03:14, 4F
→
06/16 03:14, , 5F
06/16 03:14, 5F
我猜你是說 EM64T. 指標大小和 int 大小恐怕一點關係也沒有。適合存指標的整數型態,
根據 C99 標準(n1256),是 intptr_t 或 uintptr_t, 不是 int 或 unsigned int.
※ 編輯: Favonia 來自: 140.112.30.39 (06/16 03:32)
→
06/16 04:10, , 6F
06/16 04:10, 6F
→
06/16 04:10, , 7F
06/16 04:10, 7F
→
06/16 04:11, , 8F
06/16 04:11, 8F
→
06/16 04:14, , 9F
06/16 04:14, 9F
→
06/16 04:32, , 10F
06/16 04:32, 10F
推
06/16 08:31, , 11F
06/16 08:31, 11F
→
06/16 08:32, , 12F
06/16 08:32, 12F
→
06/16 08:32, , 13F
06/16 08:32, 13F
→
06/16 08:33, , 14F
06/16 08:33, 14F
→
06/16 08:38, , 15F
06/16 08:38, 15F
→
06/16 08:40, , 16F
06/16 08:40, 16F
→
06/16 08:41, , 17F
06/16 08:41, 17F
※ 編輯: Favonia 來自: 140.112.30.39 (06/16 08:49)
→
06/16 09:43, , 18F
06/16 09:43, 18F
→
06/16 09:48, , 19F
06/16 09:48, 19F
→
06/16 09:52, , 20F
06/16 09:52, 20F
→
06/16 10:17, , 21F
06/16 10:17, 21F
→
06/16 13:17, , 22F
06/16 13:17, 22F
→
06/16 14:02, , 23F
06/16 14:02, 23F
推
06/16 14:03, , 24F
06/16 14:03, 24F
推
06/16 14:36, , 25F
06/16 14:36, 25F
推
06/16 14:54, , 26F
06/16 14:54, 26F
→
06/16 15:04, , 27F
06/16 15:04, 27F
→
06/16 15:04, , 28F
06/16 15:04, 28F
→
06/16 16:30, , 29F
06/16 16:30, 29F
推
06/16 19:10, , 30F
06/16 19:10, 30F
推
06/16 20:02, , 31F
06/16 20:02, 31F
→
06/16 21:35, , 32F
06/16 21:35, 32F
討論串 (同標題文章)