風星⎝(╬゚д゚)⎠耍廢中
@mywct
Thu, Feb 2, 2023 4:03 AM
1
判斷是奇/偶數效能分析
挺有趣的,我本來以為 bitwise 來判斷應該會是最快的,結果跑完 Benchmark 後發現取餘數居然是最快的 XD
風星⎝(╬゚д゚)⎠耍廢中
@mywct
Thu, Feb 2, 2023 4:05 AM
我使用的程式語言是 C# ,網路上找了一下,有說明說 JIT 有優化 %2 的判斷動作,其實底層實作也會用 AND 來判斷,但可能還有其它的優化,所以他的效能還是比 bitwise 還來得好!
風星⎝(╬゚д゚)⎠耍廢中
@mywct
Thu, Feb 2, 2023 4:10 AM
判斷奇偶數的方法,以下皆以判斷偶數,奇數就把中間的判斷式反過來就行:
取餘數 Mod :(n % 2) == 0
位元運算子 Bitwise :(n & 1) == 0
位移運算 Shift :((n >> 1) << 1) == n
不過這三種其實時間的誤差很小,基本小於 0.01 ns ,所以其實用自己習慣的寫法就行,網路上的文章是推薦用取餘數,一來他夠快,再來其它 programer 看到 % 2 會馬上能聯想到這是要判斷奇偶數;除非你就是要炫技讓其它人看不懂這在搞啥鬼,那就推薦用 shift ,夠混亂邪惡XD
風星⎝(╬゚д゚)⎠耍廢中
@mywct
Thu, Feb 2, 2023 5:37 AM
Bitwise 的原理是 2 進位的第 1 個位元如果是 0 ,那就一定是偶數,所以透過 & 1 來取出第 1 個位元判斷是奇數(1)還是偶數(0)
而 Shift 的原理則是先向右位移,把第 1 個(最右)位元擠掉,再向左位移,由於這樣會把第 1 個(最右)位元補 0 ,如果前面這樣的操作後值還是相等,那就是偶數
風星⎝(╬゚д゚)⎠耍廢中
@mywct
Thu, Feb 2, 2023 8:03 AM
剛又讓三方PK一次,跟中午不同的是中午其實我是打算拿來判斷字串的長度,所以是找固定字串的 String.Length ,但這次的直接給一個固定的數字來跑
然後 Bitwise 就出頭天了XD,不過跟早上的結論其實是一樣的,因為其誤差極小(平均不到 0.01 ns),依然是建議以自己習慣的撰寫即可!
(我主要是要設計 HexStringToByte ,由於 HexString 一定是偶數字元,所以奇數字元需要 throw format exception ,然後就在那想 & 跟 mode 的效能差異,剛好最近都在玩 Benchmark ,就讓他們 PK 一下!
載入新的回覆
判斷是奇/偶數效能分析
挺有趣的,我本來以為 bitwise 來判斷應該會是最快的,結果跑完 Benchmark 後發現取餘數居然是最快的 XD
取餘數 Mod :(n % 2) == 0
位元運算子 Bitwise :(n & 1) == 0
位移運算 Shift :((n >> 1) << 1) == n
不過這三種其實時間的誤差很小,基本小於 0.01 ns ,所以其實用自己習慣的寫法就行,網路上的文章是推薦用取餘數,一來他夠快,再來其它 programer 看到 % 2 會馬上能聯想到這是要判斷奇偶數;除非你就是要炫技讓其它人看不懂這在搞啥鬼,那就推薦用 shift ,夠混亂邪惡XD
而 Shift 的原理則是先向右位移,把第 1 個(最右)位元擠掉,再向左位移,由於這樣會把第 1 個(最右)位元補 0 ,如果前面這樣的操作後值還是相等,那就是偶數
剛又讓三方PK一次,跟中午不同的是中午其實我是打算拿來判斷字串的長度,所以是找固定字串的 String.Length ,但這次的直接給一個固定的數字來跑
然後 Bitwise 就出頭天了XD,不過跟早上的結論其實是一樣的,因為其誤差極小(平均不到 0.01 ns),依然是建議以自己習慣的撰寫即可!
(我主要是要設計 HexStringToByte ,由於 HexString 一定是偶數字元,所以奇數字元需要 throw format exception ,然後就在那想 & 跟 mode 的效能差異,剛好最近都在玩 Benchmark ,就讓他們 PK 一下!