Dot-Net
.NET 4.0 執行時是否比 .NET 2.0 執行時慢?
在我將我的項目升級到 .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 在這裡有一篇關於這個主題的優秀文章 。