2013-07-11 57 views
0

Do redundant casts get optimized?我可以看到,編譯器不會優化不必要的向下轉換(即castclass)。但是現在我對一個更簡單的情況感興趣,「如果編譯器優化了不必要的拋棄?」這個問題只涉及參考類型,而不是boxing編譯器是否優化了不必要的/冗餘的丟棄或者它是否產生任何IL?

在我看來,upcast不會產生任何IL,因此多餘的顯式upcast完全沒有成本?或者因爲IL指令是無類型的,幕後的冗餘顯式upcast仍有性能成本?

或者有時會上傳產生任何IL指令?

class Foo 
{ 
} 
class Bar : Foo 
{ 
} 
bool Test(object x) 
{ 
    return x == null; 
} 
void Main() 
{ 
    var x = new Bar(); 
    Console.Write(Test((Foo)x)); // redundant explicit to Foo, and then implicit to Object 
    var y = new Bar();   // implicit to Object 
    Console.Write(Test(y)); 
} 

IL_0000: newobj  UserQuery+Bar..ctor 
IL_0005: stloc.0  // x 
IL_0006: ldarg.0  
IL_0007: ldloc.0  // x 
IL_0008: call  UserQuery.Test 
IL_000D: call  System.Console.Write 
IL_0012: newobj  UserQuery+Bar..ctor 
IL_0017: stloc.1  // y 
IL_0018: ldarg.0  
IL_0019: ldloc.1  // y 
IL_001A: call  UserQuery.Test 
IL_001F: call  System.Console.Write 
+0

它可能是c#編譯器刪除演員到'Foo',導致它是不必要的 – Jehof

+0

@Jehof是的,這就是我想問的問題:C#總是優化掉不必要的上傳嗎? – colinfang

+0

當然,這是一個非常簡單的優化實施。 IL是非*無類型的,遠非如此。 –

回答

1

首先,這是一個非常微觀的優化。你應該擔心讓你的代碼正確和可讀。只有當您識別出性能不佳的部件時,纔會對這些部件進行優化,並衡量您的優化是否真正起作用其次,即使IL包含castclass指令,它仍然可以在JIT彙編代碼中優化掉,所以它不會對性能產生任何影響。

第三,我想不出任何一個upcast需要castclass(或任何其他指令)的情況。這是因爲在IL中,方法是通過元數據令牌直接調用的,因此不需要向上重載以獲得方法的正確重載或類似的東西。 IL沒有類型推斷,所以你需要在任何情況下明確指定類型參數,這意味着castclass在這裏也不需要。

相關問題