2017-10-17 217 views
0

从.NET 3.5(.NET 2.0运行时)迁移到NET 4.0后,我们可以看到在分配更大的内存块时性能下降。请查看以下测试代码。这是一个代表我们正在使用的真实世界场景的简约测试程序。任何人都可以解释一下.NET 2.0和4.0运行时间之间的巨大差异,它是多少太慢?重现步骤:.NET 2.0与.NET 4.0运行时分配性能

  1. 将代码导入到C#控制台应用程序中。
  2. 将平台目标设置为x64。
  3. 目标.NET 3.5并进行发布构建。
  4. 运行EXE(不要从IDE运行!)并在控制台中输入“test”。
  5. 等待结果。
  6. 重复使用.NET 4.0。

谢谢。

亚历

class Program { 

    static DateTime firstdate, lastdate; 

    const int CHUNKSIZE = 10 * 1024 * 1024; // 10 MB. 
    const int TRIALS = 10000; 

    static void startmeasure() { 

     firstdate = DateTime.Now; 

    } 

    static void stopmeasure() { 

     lastdate = DateTime.Now; 

     var duration = lastdate.Subtract(firstdate); 

     Console.WriteLine("Test duration:" + duration.TotalSeconds.ToString()); 

    } 

    static void Main(string[] args) { 

     string input; 

     do { 

      input = Console.ReadLine(); 

      switch (input) { 

       case "test": 

        handletest(); 

        break; 

      } 

     } while (input != "exit"); 

    } 

    static void handletest() { 

     startmeasure(); 

     byte[] data; 

     for (int i = 0; i < TRIALS; i++) { 

      data = getdata(CHUNKSIZE); 

     } 

     stopmeasure(); 

    } 

    static byte[] getdata(int size) { 

     return new byte[size]; 

    } 

} 
+0

如果您没有太多空白行,您的代码将会显着易于阅读。空白是有用的,但不是在*每行*之后...(我还建议你遵循适当的命名约定,即使是一次性代码 - 它可以让大家更容易阅读。) –

+1

这是RyuJIT的一个副作用,重写了.NET 4.6中首次发布的x64抖动。旧的抖动有一个更积极的优化器,这是一个变成bug的诀窍。旧的优化器完全删除了getdata()调用,因为它的返回值从不使用。当然有很大的差异。你实际上发现perf性能问题不太可能,没有人真正写这样的代码。请考虑在真实代码上使用分析器,以便缩小其中昂贵的部分。 –

回答

0

正如汉斯指出的那样,答案在于不同的方式.NET 2和4的优化快速存储器分配和早期对象回收。在这种测试代码中看到.NET 4执行速度较慢并不意味着它在实际应用程序中的性能较低,所以这只是一种特殊情况。

答: