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

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

实践出真知:

新建一个控制台应用程序

  class Program {
static void Main(string[] args) { for (int i = ; i < ; i++)
{
Test();
Console.WriteLine();
} Console.Read();
} public static void Test()
{ Stopwatch stw = new Stopwatch();
Stopwatch stw1 = new Stopwatch();
Stopwatch stw2 = new Stopwatch(); /*Object性能测试 */
stw2.Start();//开始时间 List<int> intlist3 = new List<int>();
for( int i = ; i < ; i++ ) {
object index = i;//使用object转入和转出
intlist3.Add((int)index);
}
stw2.Stop();
Console.WriteLine("obj:{0}", stw2.Elapsed.Ticks); /*Var 性能测试 */ List<int> intlist = new List<int>();
stw1.Start();
for( int i = ; i < ; i++ ) {
var index = i;//使用var转入和转出
intlist.Add(index);
}
stw1.Stop(); Console.WriteLine("Var:{0}", stw1.Elapsed.Ticks); /*Int 性能测试 */ List<int> intlist2 = new List<int>();
stw.Start();//重新开始计时
for( int i = ; i < ; i++ ) {
int index = 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在编译的时候已经确定类型了

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

最新文章

  1. 不能将 Null 值赋给类型为 (不可为 null 的值类型)的成员。解决方法
  2. Xshell
  3. Android性能优化方法(九)
  4. Linux 文件系统错误的修复方法 ddrescue替代dd的恢复软件 备用超级块
  5. hibernate对象关系实现(二)一对一
  6. Redis作者谈Redis应用场景(转)
  7. Android使用JNI(从java调用本地函数)
  8. Codeforces Round #334 (Div. 2) A. Uncowed Forces 水题
  9. apache AH01630: client denied by server configuration错误解决方法
  10. nginx 日志格式
  11. nodebeginer
  12. Cloud Foundry 中国群英会【上海站、成都站】资料宣传
  13. (原)netbeans中添加anaconda3安装的opencv
  14. 机器学习linux系统环境安装
  15. Ubuntu下几个命令行方式使用的图片浏览工具
  16. python爬虫实例--网易云音乐排行榜爬虫
  17. Android TimeAnimator &amp;&amp; TimeListener翻译
  18. [Docker] Benefits of Multi-stage Builds
  19. 分布式大数据多维分析(OLAP)引擎Apache Kylin安装配置及使用示例【转】
  20. Windows DHCP备份还原命令

热门文章

  1. leetcode--3
  2. shp格式数据发布服务:postGIS + postgresql + geoserver
  3. 判断一个字符串是否为GUID的方法
  4. bzoj3887: [Usaco2015 Jan]Grass Cownoisseur
  5. python_9_for
  6. python_51_函数返回值1
  7. Python 之继承
  8. 安装Ubuntu桌面环境后只能Guest登录的解决办法
  9. AngularJs学习笔记-数据绑定、管道
  10. PHP中可变变量到底有什么用?