與遺留代碼一起工作,我發現我得到的大量的報表(超過500)這樣將在編譯時優化這個簡單的條件運算符嗎? (.NET)
bool isAEqualsB = (a == b) ? true : false;
這有什麼意義重寫它這樣的嗎?
bool isAEqualsB = (a == b)
還是會在編譯時優化?
在此先感謝,
Santi! =)
與遺留代碼一起工作,我發現我得到的大量的報表(超過500)這樣將在編譯時優化這個簡單的條件運算符嗎? (.NET)
bool isAEqualsB = (a == b) ? true : false;
這有什麼意義重寫它這樣的嗎?
bool isAEqualsB = (a == b)
還是會在編譯時優化?
在此先感謝,
Santi! =)
忽略的性能 - 這是所以不太可能是一個瓶頸,這不應該是你怎麼想,直到你證明它的相關的適當基準。
我會絕對雖然關心可讀性 - 從這個角度來看,我認爲第二種方法要好得多,並且肯定會使用它。
編輯:在優化方面,它看起來像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大小的差異可能意思是內聯與非內...
不管是否優化,第一條語句都可以替換。
bool isAEqualsB = (a == b)
這只是乾淨的代碼a == b
是一個布爾表達式,不需要其他任何東西。把它看作是改進代碼庫的可維護性和可讀性的重構,而不一定是性能上的勝利。
絕對重寫它。編譯器可能會進行此優化,但這並不重要,因爲如果您現在花時間修復代碼,代碼將更具可讀性。
更好的是,首先取消這些變量聲明,並用a == b
替換它們的用法。
此外,發現誰寫的代碼,並給他們邪惡的眼睛:)
如果代碼工作,我會離開它,它是這樣的。你將花費重寫它的時間永遠不會被償還。是的,第二種方法更簡潔易讀,但需要時間來改變500次以上的模式,並且出現錯誤的可能性 - 將工作代碼轉換爲非工作代碼 - 零。從重構中獲得的可讀性好處不會彌補時間和進行更改所涉及的風險。
就執行而言,編譯器幾乎可以肯定地優化第一個到第二個。但正如其他人所說的那樣,即使編譯器沒有對其進行優化,性能增益也會微乎其微。
但我肯定會使用第二種方法的新代碼。
提示:使用Visual Studio正則表達式使查找/替換/重構超級快捷(http://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.80).aspx) – Reddog