Dot-Net

.NET 4.0 執行時是否比 .NET 2.0 執行時慢?

  • May 19, 2010

在我將我的項目升級到 .NET 4.0(使用 VS2010)後,我意識到它們的執行速度比在 .NET 2.0(VS2008)中要慢。所以我決定在 VS2008 和 VS2010 中使用各種目標框架對一個簡單的控制台應用程序進行基準測試:

using System;
using System.Diagnostics;
using System.Reflection;

namespace RuntimePerfTest
{
   class Program
   {
       static void Main(string[] args)
       {
           Console.WriteLine(Assembly.GetCallingAssembly().ImageRuntimeVersion);
           Stopwatch sw = new Stopwatch();

           while (true)
           {
               sw.Reset();
               sw.Start();

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

               }

               TimeSpan elapsed = sw.Elapsed;
               Console.WriteLine(elapsed);
           }
       }
   }
}

結果如下:

  • VS2008

    • 目標框架 2.0:~0.25 秒
    • 目標框架 3.0:~0.25 秒
    • 目標框架 3.5:~0.25 秒
  • VS2010

    • 目標框架 2.0:~3.8 秒
    • 目標框架 3.0:~3.8 秒
    • 目標框架 3.5:~1.51 秒
    • 目標框架 3.5 客戶端配置文件:~3.8 秒
    • 目標框架 4.0:~1.01 秒
    • 目標框架 4.0 客戶端配置文件:~1.01 秒

我最初的結論顯然是用 VS2008 編譯的程序比用 VS2010 編譯的程序執行得更快。

誰能解釋一下 VS2008 和 VS2010 之間的性能變化?以及 VS2010 本身內部的不同目標框架之間?

我想我明白了。

如果您在 64 位機器上執行,請確保建構設置為“任何 CPU”而不是“x86”。這樣做解決了我機器上的問題。

新項目的預設設置在 VS2010 中從“任何 CPU”更改為“x86”——我相信這是為了讓編輯和繼續在 64 位機器上預設工作(因為它只支持 x86)。

在 64 位機器上執行 x86 程序顯然不是最理想的。

編輯:根據 Dustin 的評論,執行 x86 而不是 x64 在更有效地使用記憶體(更短的引用)方面具有性能優勢。

我還通過電子郵件與達斯汀通信,他包括以下原因:

FWIW,預設目標平台沒有更改為支持 ENC。我們已經在 x64 上發布了 2 個版本的 ENC 損壞。因此,就其本身而言,ENC 並不是一個令人信服的轉換理由。我們切換的主要原因(不分先後)是:

  • x64 不支持 IntelliTrace。因此,最酷的新功能之一不適用於任何 CPU 項目的 x64 Windows。
  • x64 EXE 在 x64 Windows 上的執行速度比 x86 EXE 慢。因此,x86 調試、x64 發布的想法意味著發布中的“優化”建構實際上會表現得更差。
  • 客戶在部署應用程序並發現它不起作用時抱怨,即使它在他們的機器上執行。這些通常與 P/Invoke 相關,但是可以在應用程序中做出許多其他假設,這些假設在以不同位數執行時可能會中斷。

上述原因加上 Any CPU 沒有帶來任何好處的事實(即,您實際上不能利用擴展的地址空間,因為 EXE 仍可能在 x86 上執行)是切換預設值的原因。

Rick Byers 在這裡有一篇關於這個主題的優秀文章 。

引用自:https://stackoverflow.com/questions/2864223