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

C#中var、int、object性能比较(已修正)的更多相关文章

  1. Oracle中HWM与数据库性能的探讨

    Oracle中HWM与数据库性能的探讨 一.什么是高水位 HWM(high water mark),高水标记,这个概念在segment的存储内容中是比较重要的.简单来说,HWM就是一个segment中 ...

  2. 直接修改托管堆栈中的type object pointer(类型对象指针)

    都知道.NET是一个强对象类型的框架. 那么对于对象类型又是怎么确定的呢. 最初的我简单认为数据的类型就是定义时字段的类型修饰决定的(回来发现这种观点是绝对错误的) 我们知道引用对象存储在托管堆栈中, ...

  3. c#中var关键字用法

    Technorati 标签: C# 转载自csdn:http://blog.csdn.net/robingaoxb/article/details/6175533   var关键字是C# 3.0开始新 ...

  4. C#中var关键字【转】

    [转]http://blog.csdn.net/courageously/article/details/5695626 var关键字是C# 3.0开始新增的特性,称为推断类型 . 可以赋予局部变量推 ...

  5. 《python解释器源码剖析》第2章--python中的int对象

    2.0 序 在所有的python内建对象中,整数对象是最简单的对象.从对python对象机制的剖析来看,整数对象是一个非常好的切入点.那么下面就开始剖析整数对象的实现机制 2.1 初识PyLongOb ...

  6. .NET 5 中的正则引擎性能改进(翻译)

    前言 System.Text.RegularExpressions 命名空间已经在 .NET 中使用了多年,一直追溯到 .NET Framework 1.1.它在 .NET 实施本身的数百个位置中使用 ...

  7. Java访问Scala中的Int类型

    出错代码 写java 和 scala 混合代码的时候遇到一个小问题 def extractRefInputFieldsWithType(exprs: JList[RexNode]): Array[(I ...

  8. 【前端】js中new和Object.create()的区别

    js中new和Object.create()的区别 var Parent = function (id) { this.id = id this.classname = 'Parent' } Pare ...

  9. Win7-其中的文件夹或文件已在另一个程序中打开

    Win7-其中的文件夹或文件已在另一个程序中打开 如何解决Win7系统在删除或移动文件时提示,“操作无法完成,因为其中的文件夹或文件已在另一个程序中打开,请关闭该文件夹或文件,然后重试”.   步骤阅 ...

随机推荐

  1. TFS看板的迭代规划

    故事点 故事点更多体现的是用户情景或者bug的规模,采用斐波拉契数列(1,2,3,5,8,13)这样的数字表示,包含如下内容: 相对工作量 复杂度 风险和不确定性 相对工作量 下面演示一个Case来说 ...

  2. C语言标准库之setjmp

    协程的介绍 协程(coroutine),意思就是“协作的例程”(co-operative routines),最早由Melvin Conway在1963年提出并实现.跟主流程序语言中的线程不一样,线程 ...

  3. 【BZOJ4571】[SCOI2016] 美味(主席树)

    点此看题面 大致题意: 给你一个序列\(a\),然后每次询问\(max_{i=l}^r(a_i+x)\ xor\ b\). 大致思路 首先,我们要知道一个简单的性质:位运算时位与位之间是互不影响的. ...

  4. 【BZOJ1040】[ZJOI2008] 骑士(基环外向树DP)

    点此看题面 大致题意: 给你一片基环外向树森林,如果选定了一个点,就不能选择与其相邻的节点.求选中点的最大权值和. 树形\(DP\) 此题应该是 树形\(DP\) 的一个升级版:基环外向树\(DP\) ...

  5. Go - 环境安装

    目录 你好,Go语言 环境安装 目录结构 命令 开发工具 学习网址 小结 你好,Go语言 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. 因工作需要,准备入坑,先从环境安装开始 ...

  6. SOA体系-三大核心部件

    1.ESB(Enterprise Service Bus)企业服务总线.ESB是传统中间件技术与XML.Web服务等技术结合的产物.ESB提供了网络中最基本的连接中枢,是构筑企业神经系统的必要元素.从 ...

  7. SqlServer2000事件探测器的使用

    由于公司自己开发的项目,需要与第三方软件数据库对接.我们项目用的数据库是MySQL而第三方用的是sqlserver2000.项目框架用的thinkphp5.0,通过thinkPHP新建一个模块,单独连 ...

  8. SummerVocation_Learning--java的自动打包与解包

    Auto Boxing: 自动将基础类型转换成对象(JDK1.5之后支持) Auto UnBoxing:自动将对象转换成基础类型 如 Map中的put方法,如果要传入键值对<a,1>,&l ...

  9. 2018.10.30 NOIp模拟赛T2 数字对

    [题目描述] 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题.        她的面前浮现出一个长度为 n 的序列{ai},她想找出一段区间[L, R](1 <= L <= ...

  10. django+xadmin在线教育平台(一)

    大家好,此教程为在慕学网的实战教程Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台的学习笔记,不对望指正! 使用Django+Xadmin打造在线教育平台(Python2, ...