2015-05-09 41 views
7

我在C#中創建了一個流行的Winforms程序,它有很多GUI小部件,並發現當平臺目標爲x64時,啓動速度比86。在x64目標下,啓動大約需要5秒鐘,這對用戶體驗有負面影響。我想讓它更快。啓動Winforms程序相對於x86在x64下速度要慢10倍以上

我也試過用我的另一個程序,還發現在x64下的啓動時間是x86的兩倍或三倍。

所以我開始想知道是什麼導致了它。我的程序使用了很多小部件,爲了測試理論,我決定用800個按鈕創建一個測試項目!我將它們全部設置爲Visible=False,以便重新繪製/刷新速度不會混淆水域。

Sample form with 800 buttons

令我吃驚的是,在64開始了很多比86相當於慢。然後我開始計時InitializeComponent();部分,果然,x64版本運行時間約爲3.5秒。另一方面,x86只用了大約0.275秒。這快了近13倍!

.NET Framework 2.0,3.0和3.5同樣糟糕。針對.NET 4 &在x64下4.5 4.5秒左右的時間要好得多,但這仍然是緩慢的3倍(x86大約是0.28秒),我想用.NET 3.5來增加用戶基數。

所以我的問題是:是什麼導致x64版本啓動這麼慢,我怎麼可以讓它更快,以便它相媲美x86版本?

如果有人想立即測試,我創建了VS 2010項目,該項目可以在這裏下載的ZIP:http://www.skytopia.com/stuff/64_vs_32bit_Startup_Speed.zip

+1

32位和64位之間的一個性能差異在於64位JITter編譯所花的時間更長(但生成的代碼更好)。但我認爲你的代碼不太可能受到JIT性能的限制,所以不應該成爲你的性能問題的原因。新的RyuJIT提高了64位JIT時間,但產生比當前64位JITter更糟的代碼。 – CodesInChaos

+0

@CodesInChaos:有趣。我決心要做到這一點的底部。它具有很高的可重複性,對許多用戶和開發人員有很大的影響。 –

+0

將.net 4.5而不是3.5的性能從我的機器上的2.0秒提高到1.3。 – CodesInChaos

回答

6

這是你的10000行InitializeComponent功能的JIT成本。

  • 如果測量調用InitializeComponent和第一線的執行之間的時間,這是大部分成本。 (只需在InitializeComponent的頂部插入一行進行測量。)

  • 如果使用VS性能分析器,它將顯示大部分時間花費在與JIT相關的ThePreStub上。

  • 64位抖動需要更長的時間來編譯代碼比32位的抖動,但在交換它產生更好的代碼。

    微軟正在開發名爲RyuJIT的新版JITter。它來源於32位JITter,具有相似的特徵(快速編譯輸出更糟糕的代碼)。它將成爲未來.NET版本的標準JIT。

  • .NET 4.5將我的機器上的成本從2.0秒降低到1.3。這可能是由於4.0運行時的JIT改進。

  • 等效循環是比你的InitializeComponent函數更快。

    ,如果你想創建在設計所有的組件將不會幫助你,但如果你有,你要在設計師編輯重複的控件和組件的組合,你可以使用一個循環。只需將它放在Form1.cs而不是Form1.designer.cs中,這樣它就不會被設計人員覆蓋。

  • 在裝配上使用NGen應該消除JIT成本。但它有不得不與GAC打交道的缺點。

+0

您也可以使用NGen來消除JIT成本。 – Zer0

+0

NGen是一個簡單的解決方案,它將我的機器從〜1400毫秒降到〜170毫秒。 –

+0

所有優點。但是直接使用for/loop優化來編輯designer.cs代碼是理論上的,因爲只要我在所見即所得的設計編輯器中調整某些東西,它就會恢復。 .NET 4.5的速度確實快得多,但我認爲我想爲更大的用戶羣提供.NET 3.5。 RyuJIT聽起來不錯,但還沒有出來,而且NGen已經指出了妥協。不知何故,這有什麼「黑客」? –

相關問題