2011-11-02 21 views
4

與遺留代碼一起工作,我發現我得到的大量的報表(超過500)這樣將在編譯時優化這個簡單的條件運算符嗎? (.NET)

bool isAEqualsB = (a == b) ? true : false; 

這有什麼意義重寫它這樣的嗎?

bool isAEqualsB = (a == b) 

還是會在編譯時優化?

在此先感謝,

Santi! =)

+1

提示:使用Visual Studio正則表達式使查找/替換/重構超級快捷(http://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.80).aspx) – Reddog

回答

8

忽略的性能 - 這是所以不太可能是一個瓶頸,這不應該是你怎麼想,直到你證明它的相關的適當基準。

我會絕對雖然關心可讀性 - 從這個角度來看,我認爲第二種方法要好得多,並且肯定會使用它。

編輯:在優化方面,它看起來像C#編譯器不優化它:

// First form 
    IL_0000: ldarg.0 
    IL_0001: ldarg.1 
    IL_0002: beq.s  IL_0007 
    IL_0004: ldc.i4.0 
    IL_0005: br.s  IL_0008 
    IL_0007: ldc.i4.1 
    IL_0008: stloc.0 

    // Second form 
    IL_0009: ldarg.0 
    IL_000a: ldarg.1 
    IL_000b: ceq 
    IL_000d: stloc.1 

然而,這不是IL會理所當然的 - 這是JIT編譯器做什麼。現在即使是IL大小的差異可能意思是內聯與非內...

4

不管是否優化,第一條語句都可以替換。

bool isAEqualsB = (a == b) 

這只是乾淨的代碼a == b是一個布爾表達式,不需要其他任何東西。把它看作是改進代碼庫的可維護性和可讀性的重構,而不一定是性能上的勝利。

2

絕對重寫它。編譯器可能會進行此優化,但這並不重要,因爲如果您現在花時間修復代碼,代碼將更具可讀性。

更好的是,首先取消這些變量聲明,並用a == b替換它們的用法。

此外,發現誰寫的代碼,並給他們邪惡的眼睛:)

1

如果代碼工作,我會離開它,它是這樣的。你將花費重寫它的時間永遠不會被償還。是的,第二種方法更簡潔易讀,但需要時間來改變500次以上的模式,並且出現錯誤的可能性 - 將工作代碼轉換爲非工作代碼 - 零。從重構中獲得的可讀性好處不會彌補時間和進行更改所涉及的風險。

就執行而言,編譯器幾乎可以肯定地優化第一個到第二個。但正如其他人所說的那樣,即使編譯器沒有對其進行優化,性能增益也會微乎其微。

但我肯定會使用第二種方法的新代碼。