《.net 架構程式設計》裡的幾句代碼,我重新整理了一下,寫成函數,這樣下面的反編譯代碼看起來更方便點:
public void Boxing()
{
Int32 v = 5;
Console.WriteLine("{0},{1},{2}",v,v,v);
}
public void Boxing1()
{
Int32 v = 5;
object o = v;
Console.WriteLine("{0},{1},{2}",o,o,o);
}
兩個函數的輸出結果是一樣的,但是哪一個函數更好呢?
第一個顯然更簡單,但是在效能上第二個好,看看反編譯的代碼:
Boxing函數:.method public hidebysig instance void Boxing() cil managed
{
// Code Size: 31 byte(s)
.maxstack 4
.locals (
int32 V_0)
L_0000: ldc.i4.5
L_0001: stloc.0
L_0002: ldstr "{0},{1},{2}"
L_0007: ldloc.0
L_0008: box int32
L_000d: ldloc.0
L_000e: box int32
L_0013: ldloc.0
L_0014: box int32
L_0019: call void [mscorlib]System.Console::WriteLine(string, object, object, object)
L_001e: ret
}
Boxing1函數的:.method public hidebysig instance void Boxing1() cil managed
{
// Code Size: 23 byte(s)
.maxstack 4
.locals (
int32 V_0,
object V_1)
L_0000: ldc.i4.5
L_0001: stloc.0
L_0002: ldloc.0
L_0003: box int32
L_0008: stloc.1
L_0009: ldstr "{0},{1},{2}"
L_000e: ldloc.1
L_000f: ldloc.1
L_0010: ldloc.1
L_0011: call void [mscorlib]System.Console::WriteLine(string, object, object, object)
L_0016: ret
}
第一個函數有三次裝箱操作,第二個只有一次,在記憶體和時間消耗上都要小些。
這麼簡單的代碼,在效能上都有這麼大的差異,以前寫的程式裡還不知道有多少有問題的代碼