看板 C_and_CPP 關於我們 聯絡資訊
印象中曾經聽說過 對電腦來說 否定敘述 的判斷 會比 正向敘述 來得有效率 想請問這麼說的原因是什麼呢??? 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
twotwoone:ex2的!=跟==應該是差不多的運算,只要把兩個運算元相減 09/01 16:31
twotwoone:然後用JE或JNE就行。CPU應該花費一樣的 clock cycle 09/01 16:32
AGanPTT:所以ex1第二個有比較快? 09/01 16:34
walker2009:11585這篇文章推文中, bleed大也是建議用否定敘述@@ 09/01 16:37
ledia:與其看 je 還是 jne 快, 不如看是要 jmp 的多, 還是不 jmp 09/01 16:46
ledia:的多吧 ? 09/01 16:46
walker2009:所以重點在於轉成組語之後的 cycle time 嗎@@ 09/01 17:04
walker2009:那 "否定敘述判斷式較有效率" 這句話是否不一定成立了? 09/01 17:04
james732:印象中與CPU的分支預測技術也有關(Branch prediction) 09/01 17:05
VictorTom:11585那篇的重點不是not而是和0比較吧?? 09/01 17:05
james732:不過我覺得這種問題交給compiler做最佳化就好了... 09/01 17:06
VictorTom:另外也像l與j大說的, 看分支預測與jmp多還是不jmp多@_@" 09/01 17:06
walker2009:我當初聽到的說法感覺比較像是 09/01 17:07
walker2009:"使用否定敘述,compiler才能做出較佳的最佳化" 09/01 17:08
VictorTom:兩種敘述只是je或是jne的差別吧, 和0比較可能還有差@_@" 09/01 17:09
walker2009:我的 3n+1 最快只能到 0.020 sec Q_Q 極限了 09/01 17:20
walker2009:真想知道 0.000 是怎麼寫出來的 ... 09/01 17:21
ledia:profiling 看看瓶頸在哪, 說不定是 io 或是表建不夠大 09/01 17:30
VictorTom:在比較performance之前有確認過軟硬體平台是否一致嗎?? 09/01 17:52
walker2009:oh...沒考慮到這個層面! 又多了一個經驗 謝謝^^ 09/01 18:30
netsphere:建表加速? 09/01 18:47
bleed1979:躺著也中槍 我想我會用&1 不過和題目無關就是了 09/01 19:04
VictorTom:小弟也會用&1....XD %2的N次方時, &2的N次方-1 是好物:) 09/01 19:22
walker2009:我有建表 也有用&1 XDD 還是 0.020 o.o 09/01 19:39
sunneo:是在說branch prediction嗎 通常都先猜false 09/01 19:47
sunneo:猜錯了才沖掉pipeline 09/01 19:47
bleed1979:可以查找sagit acm code的100-2 很強力的建表 09/01 19:50
alongalone:我也是用 &1 ....XD , 某天突然想到的... 09/09 00:20