var關鍵字是.net3.5推出的關鍵字,主要是讓編譯器自動推斷並判斷變數類型,類似javascript中的var。在使用一些性能優化軟體時,在代碼優化時,我發現不管定義什麼類型的變數,變數的類型都統統換成var。難道var的性能比具體的類型和object都要高?實踐出真知:新建一個控制台應用程式 ...
var關鍵字是.net3.5推出的關鍵字,主要是讓編譯器自動推斷並判斷變數類型,類似javascript中的var。
在使用一些性能優化軟體時,在代碼優化時,我發現不管定義什麼類型的變數,變數的類型都統統換成var。難道var的性能比具體的類型和object都要高?
實踐出真知:
新建一個控制台應用程式
1 class Program { 2 static void Main(string[] args) { 3 4 for (int i = 0; i < 10; i++) 5 { 6 Test(); 7 Console.WriteLine(); 8 } 9 10 11 12 Console.Read(); 13 } 14 15 16 public static void Test() 17 { 18 19 Stopwatch stw = new Stopwatch(); 20 Stopwatch stw1 = new Stopwatch(); 21 Stopwatch stw2 = new Stopwatch(); 22 23 24 /*Object性能測試 */ 25 stw2.Start();//開始時間 26 27 List<int> intlist3 = new List<int>(); 28 for( int i = 0; i < 10000000; i++ ) { 29 object index = i;//使用object轉入和轉出 30 intlist3.Add((int)index); 31 } 32 stw2.Stop(); 33 Console.WriteLine("obj:{0}", stw2.Elapsed.Ticks); 34 35 36 /*Var 性能測試 */ 37 38 39 List<int> intlist = new List<int>(); 40 stw1.Start(); 41 for( int i = 0; i < 10000000; i++ ) { 42 var index = i;//使用var轉入和轉出 43 intlist.Add(index); 44 } 45 stw1.Stop(); 46 47 Console.WriteLine("Var:{0}", stw1.Elapsed.Ticks); 48 49 /*Int 性能測試 */ 50 51 52 List<int> intlist2 = new List<int>(); 53 stw.Start();//重新開始計時 54 for( int i = 0; i < 10000000; i++ ) { 55 int index = i;//使用int轉入和轉出 56 intlist2.Add(index); 57 } 58 stw.Stop(); 59 60 Console.WriteLine("int:{0}", stw.Elapsed.Ticks); 61 62 63 } 64 65 }
測試結果:
分析:
通過查閱文檔和書籍,var是隱式類型的局部變數 主要是方便書寫。在編譯期間,早已把var替換為實際推斷的類型(這裡是int),而object多了一個裝箱拆箱的操作,
耗時自然是最長的。
以下是筆者對程式進行反編譯(C# 和 IL)後的截圖,我們可以清晰滴看到多餘的代碼已經被優化,而所謂的var也不見了。在IL源碼中,明顯的看到object在迴圈的時候有裝箱拆箱的操作。
反編譯的C#代碼:(已經被優化)
object測試的IL:
var測試的IL:
int測試的IL:
總結:
var性能 ≈ int > object
object 類型牽涉裝箱拆箱的問題,自然是效率最慢的。
但從測試結果來看,var類型的性能與int不相上下,但在測試結果中可以看到大部分var耗時會超過int。 實際上var在編譯的時候已經確定類型了
PS:最後感謝朋友們對筆者之前測試的錯誤指正,多交流才能更好的提高自己,增加見聞,積累人脈,這也是筆者寫博客的意義,否則這個知識點認識,對筆者來講可能永遠是一個錯誤。