C#中var、int、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:最后感謝朋友們對筆者之前測試的錯誤指正,多交流才能更好的提高自己,增加見聞,積累人脈,這也是筆者寫博客的意義,否則這個知識點認識,對筆者來講可能永遠是一個錯誤。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM