C#中var、int、object性能比较

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

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

实践出真知:

新建一个控制台应用程序

class Program {
        static void Main(string[] args) {

            for (int i = 0; i < 10; 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 = 0; i < 10000000; 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 = 0; i < 10000000; 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 = 0; i < 10000000; 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值