zoukankan      html  css  js  c++  java
  • C#中var、int、object性能比较(已修正)

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

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

    实践出真知:

    新建一个控制台应用程序

     1  class Program {
     2         static void Main(string[] args) {
     3 
     4             for (int i = 0; i < 10; i++)
     5             {
     6                 Test();
     7                 Console.WriteLine();
     8             }
     9 
    10           
    11 
    12             Console.Read();
    13         }
    14 
    15 
    16         public static void Test()
    17         {
    18 
    19             Stopwatch stw = new Stopwatch();
    20             Stopwatch stw1 = new Stopwatch();
    21             Stopwatch stw2 = new Stopwatch();
    22 
    23 
    24             /*Object性能测试 */
    25             stw2.Start();//开始时间
    26 
    27             List<int> intlist3 = new List<int>();
    28             for( int i = 0; i < 10000000; i++ ) {
    29                 object index = i;//使用object转入和转出
    30                 intlist3.Add((int)index);
    31             }
    32             stw2.Stop();
    33             Console.WriteLine("obj:{0}", stw2.Elapsed.Ticks);
    34 
    35 
    36             /*Var 性能测试 */
    37 
    38 
    39             List<int> intlist = new List<int>();
    40             stw1.Start();
    41             for( int i = 0; i < 10000000; i++ ) {
    42                 var index = i;//使用var转入和转出
    43                 intlist.Add(index);
    44             }
    45             stw1.Stop();
    46 
    47             Console.WriteLine("Var:{0}", stw1.Elapsed.Ticks);
    48 
    49             /*Int 性能测试 */
    50 
    51 
    52             List<int> intlist2 = new List<int>();
    53             stw.Start();//重新开始计时
    54             for( int i = 0; i < 10000000; i++ ) {
    55                 int index = i;//使用int转入和转出
    56                 intlist2.Add(index);
    57             }
    58             stw.Stop();
    59 
    60             Console.WriteLine("int:{0}", stw.Elapsed.Ticks);
    61 
    62             
    63         }
    64 
    65     }

    测试结果:

    分析:

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



    主要研究技术:HTML5、CSS3、ASP.NET MVC、SqlServer、Jquery、EasyUI等
    专注于 代码生成工具、Web开发框架、设计模式及其应用。
    撰写人:史林枫 (qq:1326771967)
    转载请注明出处
     

  • 相关阅读:
    HDU 1423
    POJ 3264
    POJ 3177
    CodeForces 81A
    SPOJ RATING
    ZOJ 2588
    POJ 1523
    POJ 3667
    递归
    数据结构
  • 原文地址:https://www.cnblogs.com/jayshsoft/p/var_int_object_perf.html
Copyright © 2011-2022 走看看