[英]Use “greater than or equals” or just “greater than”
我記得C天以來,我們被鼓勵使用
i > -1
代替
i >= 0
由於性能。
這仍然適用於C#.NET世界嗎? 在當今的編譯器中使用一個以上的性能會有什么影響? 即編譯器是否足夠聰明,可以為您優化這些代碼?
(順便說一句,嘗試在堆棧溢出的問題字段中輸入問題“ use> = or>”,看看會發生什么。)
不,沒有與比較運算符相關的性能問題。 無論如何,任何好的編譯器都會優化這個瑣碎的東西。
我不確定您在哪里建議使用“ i> -1”而不是“ i> = 0”。 在x86體系結構上,使用哪種方法沒有什么區別:兩種情況都恰好需要兩條指令...一條進行比較,一條則跳轉:
;; if (i > -1) {
cmp eax, -1
jle else
then:
...
else:
;; if (i >= 0) {
cmp eax, 0
jl else
then:
...
else:
在我所知道的大多數RISC架構上,“ i> = 0”實際上可能更快,因為通常存在專用的零寄存器,而“ i> -1”可能需要加載一個常數。 例如,MIPS僅具有<指令(無<=)。 這是用MIPS匯編語言(天真!)表示這兩種構造的方式:
// if (i >= 0) { (assuming i is in register %t0)
stl $t1, $0, $t0 // in C: t1 = (0 < t0)
beq $t1, $0, else // jump if t1 == 0, that is if t0 >= 0
nop
then:
...
else:
// if (i > -1) { (assuming i is in register %t0)
addi $t2, $0, -1 // in C: t2 = -1
stl $t1, $t2, $t0 // in C: t1 = (t2 < t0) = (-1 < t0)
bne $t1, $0, else // jump if t1 != 0, that is if t0 > -1
nop
then:
...
else:
因此,在幼稚的一般情況下,在MIPS上執行“ i> = 0”實際上實際上要快一個指令。 當然,RISC代碼的優化程度如此之高,以至於編譯器可能會改變這兩個指令序列中的任何一個,幾乎是無法識別的:-)
所以...簡短的答案是不,不,沒有區別。
除了任何體面的編譯器都做正確的事情,以及在現代體系結構中, >
和>=
比較之間沒有速度差異這一事實之外,更大的觀點是,這是“微優化”,它沒有在大多數情況下,它會影響運行時性能。
在進行比較的情況下,無論用哪種方式編寫,通常都不會影響可讀性,但是在某些情況下,選擇一個邊界優於另一個邊界會更加清楚:例如,
if (length >= str.size())
與
if (length > str.size() - 1)
我不了解您,但我每天都會選擇選項1。 :-)在這種情況下,如不明顯影響性能,應采用更具可讀性的選項。
這里有一個非常類似的問題(沒有暗示-就像您說的那樣,搜索符號很棘手): “應該在for循環中使用<
或<=
”
(是的,由於我的回答很多,我很容易就能找到它。)
基本上,做任何最易讀的事情。 有人正確地猜想,從最易讀的形式進行更改會解決性能問題的那一天(無需探查器的幫助)是我停止談論性能的一天:)
不,您無需再執行此操作。 是的,編譯器變得更加聰明,並且兩個表達式在性能上沒有差異。
我記得C天以來,由於性能原因,我們鼓勵使用....。
你確定嗎? 我使用的計算機可以追溯到70年代初期(是的,在我父親的膝蓋上...),而且我從未見過CPU不能像>一樣快地處理> =。 (在IBM360演講中,BH“分支高”與BNL“分支不低”)。
對於某些將> =分解為2個比較的陰暗腳本語言而言,這可能是正確的,但是無論誰鼓勵您將其用於C ...好吧...您可能應該努力忘記他們曾經告訴過您的所有內容。
這讓我想起了使用++ i而不是i ++的建議(前遞增與后遞增),因為它應該比一條指令快。 (我忘記了我最初在哪兒讀到的,但這可能是C / C ++用戶雜志或Dobb博士的雜志,但我似乎找不到網絡參考。)
我嚴重懷疑>或> =更快或更慢; 而是為了清晰起見編寫代碼。
附帶說明一下,即使原因現在可能已過時,我也對pre-increment(++ i)運算符進行了開發。
大於零時,必須進行兩次檢查。 它檢查負位是否關閉,並檢查零位是否關閉。
對於大於或等於零,它只需要檢查負位是否關閉,因為我們不在乎零位是打開還是關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.