[問題] 關於 if 的判斷式 否定敘述 較有效率 之說

看板C_and_CPP作者 (誰人未嘗自以為)時間15年前 (2009/09/01 16:21), 編輯推噓9(9020)
留言29則, 10人參與, 最新討論串1/1
印象中曾經聽說過 對電腦來說 否定敘述 的判斷 會比 正向敘述 來得有效率 想請問這麼說的原因是什麼呢??? ex1. if(n%2){ .... } if(!(n%2)){ .... } ex2. if(k==0){ xxxx } else{ yyyy } if(k!=0){ yyyy } else{ xxxx } 是否都是下面那個有效率呢??? 在兩個例子中, 感覺下面的寫法都多了個否定的運算, 為什麼還會比較快呢??? 因為剛剛在嘗試 3n+1 problem 加速的部份 爬了一些文章 也看了某些大大的 code (當然有 bleed大XD) 看到判斷的地方都是用否定敘述 所以想了解電腦內部是否對否定敘述有特別的處理方式 謝謝^^ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.85.2

09/01 16:31, , 1F
ex2的!=跟==應該是差不多的運算,只要把兩個運算元相減
09/01 16:31, 1F

09/01 16:32, , 2F
然後用JE或JNE就行。CPU應該花費一樣的 clock cycle
09/01 16:32, 2F

09/01 16:34, , 4F
所以ex1第二個有比較快?
09/01 16:34, 4F

09/01 16:37, , 5F
11585這篇文章推文中, bleed大也是建議用否定敘述@@
09/01 16:37, 5F

09/01 16:46, , 6F
與其看 je 還是 jne 快, 不如看是要 jmp 的多, 還是不 jmp
09/01 16:46, 6F

09/01 16:46, , 7F
的多吧 ?
09/01 16:46, 7F

09/01 17:04, , 8F
所以重點在於轉成組語之後的 cycle time 嗎@@
09/01 17:04, 8F

09/01 17:04, , 9F
那 "否定敘述判斷式較有效率" 這句話是否不一定成立了?
09/01 17:04, 9F

09/01 17:05, , 10F
印象中與CPU的分支預測技術也有關(Branch prediction)
09/01 17:05, 10F

09/01 17:05, , 11F
11585那篇的重點不是not而是和0比較吧??
09/01 17:05, 11F

09/01 17:06, , 12F
不過我覺得這種問題交給compiler做最佳化就好了...
09/01 17:06, 12F

09/01 17:06, , 13F
另外也像l與j大說的, 看分支預測與jmp多還是不jmp多@_@"
09/01 17:06, 13F

09/01 17:07, , 14F
我當初聽到的說法感覺比較像是
09/01 17:07, 14F

09/01 17:08, , 15F
"使用否定敘述,compiler才能做出較佳的最佳化"
09/01 17:08, 15F

09/01 17:09, , 16F
兩種敘述只是je或是jne的差別吧, 和0比較可能還有差@_@"
09/01 17:09, 16F

09/01 17:20, , 17F
我的 3n+1 最快只能到 0.020 sec Q_Q 極限了
09/01 17:20, 17F

09/01 17:21, , 18F
真想知道 0.000 是怎麼寫出來的 ...
09/01 17:21, 18F

09/01 17:30, , 19F
profiling 看看瓶頸在哪, 說不定是 io 或是表建不夠大
09/01 17:30, 19F

09/01 17:52, , 20F
在比較performance之前有確認過軟硬體平台是否一致嗎??
09/01 17:52, 20F

09/01 18:30, , 21F
oh...沒考慮到這個層面! 又多了一個經驗 謝謝^^
09/01 18:30, 21F

09/01 18:47, , 22F
建表加速?
09/01 18:47, 22F

09/01 19:04, , 23F
躺著也中槍 我想我會用&1 不過和題目無關就是了
09/01 19:04, 23F

09/01 19:22, , 24F
小弟也會用&1....XD %2的N次方時, &2的N次方-1 是好物:)
09/01 19:22, 24F

09/01 19:39, , 25F
我有建表 也有用&1 XDD 還是 0.020 o.o
09/01 19:39, 25F

09/01 19:47, , 26F
是在說branch prediction嗎 通常都先猜false
09/01 19:47, 26F

09/01 19:47, , 27F
猜錯了才沖掉pipeline
09/01 19:47, 27F

09/01 19:50, , 28F
可以查找sagit acm code的100-2 很強力的建表
09/01 19:50, 28F

09/09 00:20, , 29F
我也是用 &1 ....XD , 某天突然想到的...
09/09 00:20, 29F
文章代碼(AID): #1AdDcHXh (C_and_CPP)