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:最后感谢朋友们对笔者之前测试的错误指正,多交流才能更好的提高自己,增加见闻,积累人脉,这也是笔者写博客的意义,否则这个知识点认识,对笔者来讲可能永远是一个错误。