感嘆一下:爲什麼CLR可以保持效率

 

using System;
using System.Collections.Generic;
using System.Text;

namespace IL_Learn
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            
int a = 1;
            
int b = 2;

            
float c;

            c 
= a + b;

            
float d = 0;
            d 
= a + b + c;
        }

    }

}

編譯後ildasm /adv一下,得到:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       
24 (0x18)
  .maxstack  
2
  .locals init (int32 V_0
,
           int32 V_1
,
           float32 V_2
,
           float32 V_3)
  IL_0000:  nop
  IL_0001:  ldc.i4
.1
  IL_0002:  stloc
.0
  IL_0003:  ldc.i4
.2
  IL_0004:  stloc
.1
  IL_0005:  ldloc
.0
  IL_0006:  ldloc
.1
  IL_0007:  add
  IL_0008:  conv.r4
  IL_0009:  stloc
.2
  IL_000a:  ldc.r4     
0.0
  IL_000f:  stloc
.3
  IL_0010:  ldloc
.0
  IL_0011:  ldloc
.1
  IL_0012:  add
  IL_0013:  conv.r4
  IL_0014:  ldloc
.2
  IL_0015:  add
  IL_0016:  stloc
.3
  IL_0017:  ret
} // end of method Program::Main

原來,每次要進行類型轉換,都有csc產生的conv.r4,意思是將棧頂的一個傢伙轉型爲float型,哎,CLR懶死了,連這條指令都由CSC產生!不過,這樣,把儘量多的工作交給編譯器完成,CLR只是簡單的JIT和執行,從而保證了效率。還是應該佩服一下的。

發佈了7 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章