C#中var、int、object性能比较(已修正)
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性能比较(已修正)的更多相关文章
- Oracle中HWM与数据库性能的探讨
Oracle中HWM与数据库性能的探讨 一.什么是高水位 HWM(high water mark),高水标记,这个概念在segment的存储内容中是比较重要的.简单来说,HWM就是一个segment中 ...
- 直接修改托管堆栈中的type object pointer(类型对象指针)
都知道.NET是一个强对象类型的框架. 那么对于对象类型又是怎么确定的呢. 最初的我简单认为数据的类型就是定义时字段的类型修饰决定的(回来发现这种观点是绝对错误的) 我们知道引用对象存储在托管堆栈中, ...
- c#中var关键字用法
Technorati 标签: C# 转载自csdn:http://blog.csdn.net/robingaoxb/article/details/6175533 var关键字是C# 3.0开始新 ...
- C#中var关键字【转】
[转]http://blog.csdn.net/courageously/article/details/5695626 var关键字是C# 3.0开始新增的特性,称为推断类型 . 可以赋予局部变量推 ...
- 《python解释器源码剖析》第2章--python中的int对象
2.0 序 在所有的python内建对象中,整数对象是最简单的对象.从对python对象机制的剖析来看,整数对象是一个非常好的切入点.那么下面就开始剖析整数对象的实现机制 2.1 初识PyLongOb ...
- .NET 5 中的正则引擎性能改进(翻译)
前言 System.Text.RegularExpressions 命名空间已经在 .NET 中使用了多年,一直追溯到 .NET Framework 1.1.它在 .NET 实施本身的数百个位置中使用 ...
- Java访问Scala中的Int类型
出错代码 写java 和 scala 混合代码的时候遇到一个小问题 def extractRefInputFieldsWithType(exprs: JList[RexNode]): Array[(I ...
- 【前端】js中new和Object.create()的区别
js中new和Object.create()的区别 var Parent = function (id) { this.id = id this.classname = 'Parent' } Pare ...
- Win7-其中的文件夹或文件已在另一个程序中打开
Win7-其中的文件夹或文件已在另一个程序中打开 如何解决Win7系统在删除或移动文件时提示,“操作无法完成,因为其中的文件夹或文件已在另一个程序中打开,请关闭该文件夹或文件,然后重试”. 步骤阅 ...
随机推荐
- Api容器在应用架构演化中的用途
单层架构 在最开始编程的时候相信大家都写过下面这种架构,界面代码,业务代码,数据库连接全部在工程面完成.当然这种架构在处理很小的程序的时候依然有生命力 两层架构 后来我们发现数据访问的代码大量重复,应 ...
- 【HHHOJ】NOIP模拟赛 玖 解题报告
点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...
- NOIP2018赛前停课集训记(10.24~11.08)
前言 为了不久之后的\(NOIP2018\),我们的停课从今天(\(Oct\ 24th\))起正式开始了. 本来说要下周开始的,没想到竟提早了几天,真是一个惊喜.毕竟明天有语文考试.后天有科学考试,逃 ...
- geoWithin查询 多边形查询
$geoWithin查询 形状的表示 .$box:矩形,使用 {$box:[[<x1>,<y1>],[<x2>,<y2>]]}表示 都是坐标,第一个坐标 ...
- Python判断一个数是否为小数
一.判断一个数是否为小数 1.有且仅有一个小数点 2.小数点的左边可能为正数或负数 3.小数点的右边为正数 二.实现代码 def is_float(str): if str.count('.') == ...
- 配置dubbo架构的maven项目
1. 拆分工程 1)将表现层工程独立出来: e3-manager-web 2)将原来的e3-manager改为如下结构 e3-manager |--e3-manager-dao |--e3-manag ...
- Too Rich HDU - 5527 (贪心+dfs)
Too Rich Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- 嵌入式linux:通过qemu模拟mini2440开发环境
1 编译安装QEMU 首先下载qemu for mini2440,直接打包下载 http://repo.or.cz/w/qemu/mini2440.git/snapshot/HEAD.tar.gz ...
- linux下mysql的权限设计总结
1,进入mysql,终端中输入 mysql -u 用户名 -p .enter键后,提示输入密码. 2,执行grant all privileges on xxxdb.* to usertest@& ...
- 03.VUE学习之动态绑定值
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...