var关键字是.net3.5推出的关键字,主要是让编译器自动推断并判断变量类型,类似javascript中的var。

在使用一些性能优化软件时,在代码优化时,我发现不管定义什么类型的变量,变量的类型都统统换成var。难道var的性能比具体的类型和object都要高?

实践出真知:

新建一个控制台应用程序

classProgram{staticvoidMain(string[]args){for(inti=0;i<10;i++){Test();Console.WriteLine();}Console.Read();}publicstaticvoidTest(){Stopwatchstw=newStopwatch();Stopwatchstw1=newStopwatch();Stopwatchstw2=newStopwatch();/*Object性能测试*/stw2.Start();//开始时间List<int>intlist3=newList<int>();for(inti=0;i<10000000;i++){objectindex=i;//使用object转入和转出intlist3.Add((int)index);}stw2.Stop();Console.WriteLine("obj:{0}",stw2.Elapsed.Ticks);/*Var性能测试*/List<int>intlist=newList<int>();stw1.Start();for(inti=0;i<10000000;i++){varindex=i;//使用var转入和转出intlist.Add(index);}stw1.Stop();Console.WriteLine("Var:{0}",stw1.Elapsed.Ticks);/*Int性能测试*/List<int>intlist2=newList<int>();stw.Start();//重新开始计时for(inti=0;i<10000000;i++){intindex=i;//使用int转入和转出intlist2.Add(index);}stw.Stop();Console.WriteLine("int:{0}",stw.Elapsed.Ticks);}}

测试结果:

分析:

通过查阅文档和书籍,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在编译的时候已经确定类型了