简单代码的性能差异
《.net 框架程序設(shè)計(jì)》里的幾句代碼,我重新整理了一下,寫成函數(shù),這樣下面的反編譯代碼看起來更方便點(diǎn):
dahuzizyd的專欄??? http://blog.csdn.net/dahuzizyd/
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);
????????} 兩個(gè)函數(shù)的輸出結(jié)果是一樣的,但是哪一個(gè)函數(shù)更好呢?
第一個(gè)顯然更簡(jiǎn)單,但是在性能上第二個(gè)好,看看反編譯的代碼:
Boxing函數(shù):
.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函數(shù)的:
.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?
}
第一個(gè)函數(shù)有三次裝箱操作,第二個(gè)只有一次,在內(nèi)存和時(shí)間消耗上都要小些。
這么簡(jiǎn)單的代碼,在性能上都有這么大的差異,以前寫的程序里還不知道有多少有問題的代碼
版權(quán)聲明:CSDN是本Blog托管服務(wù)提供商。如本文牽涉版權(quán)問題,CSDN不承擔(dān)相關(guān)責(zé)任,請(qǐng)版權(quán)擁有者直接與文章作者聯(lián)系解決。
dahuzizyd的專欄??? http://blog.csdn.net/dahuzizyd/
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);
????????} 兩個(gè)函數(shù)的輸出結(jié)果是一樣的,但是哪一個(gè)函數(shù)更好呢?
第一個(gè)顯然更簡(jiǎn)單,但是在性能上第二個(gè)好,看看反編譯的代碼:
Boxing函數(shù):
.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函數(shù)的:
.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?
}
第一個(gè)函數(shù)有三次裝箱操作,第二個(gè)只有一次,在內(nèi)存和時(shí)間消耗上都要小些。
這么簡(jiǎn)單的代碼,在性能上都有這么大的差異,以前寫的程序里還不知道有多少有問題的代碼
版權(quán)聲明:CSDN是本Blog托管服務(wù)提供商。如本文牽涉版權(quán)問題,CSDN不承擔(dān)相關(guān)責(zé)任,請(qǐng)版權(quán)擁有者直接與文章作者聯(lián)系解決。
總結(jié)
- 上一篇: 磁盘配额的wmi版本(C#)
- 下一篇: 获得汉字字符串拼音首字母