簡體   English   中英

使用“大於或等於”或“僅大於”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM