2009-06-26 44 views
3

我們的C#客戶端應用程序在第一次運行時總是需要更長的時間才能加載。我至今沒有去,以測試是否是任何 .NET應用程序,速度較慢,或者如果第一次運行每個 .NET應用程序是慢,但它仍然是在任何情況下,問題的第一次運行。我們如何消除這一次啓動命中?如何加速我的.NET應用程序的第一次執行的性能?

我最初的想法是某種服務可以「預熱」這些庫。我們是否需要爲我們的每個應用程序或只是任何.NET應用程序執行此操作?服務運行的用戶會有所作爲嗎?也許而不是Windows服務,在Windows登錄上運行的應用程序可以做骯髒的工作?再說一次,它是一個.NET服務就夠了,還是我們必須運行我們的每個程序來消除處罰?我們可以傳入一個命令行參數來告訴程序立即退出,但這樣做是否足夠,或者我們是否需要.NET來加載我們將在正常執行應用程序期間使用的每個程序集?


回覆:一些答案,我們正在部署版本模式的DLL,並放緩僅在第一次啓動。我們儘可能延遲類的初始化。

回答

4

其他的答案都談到JIT的時間,但在我的經驗,另一個非常顯著因素是加載.NET框架本身的啓動後第一次所用的時間。

嘗試寫一個絕對重要的程序(雖然preferrably一個至少觸動你真正的代碼使用的組件)。編譯並重新啓動。運行微不足道的程序,然後(完成時)運行真正的應用程序 - 查看與重新啓動後運行實際應用程序的方式比較,而無需運行微不足道的應用程序。

10

它可以讓你等待你運行你的應用程序的.NET首次JIT(即時編譯)。這會在運行代碼之前將您的IL編譯爲機器代碼。這只是第一次發生的原因是機器代碼版本然後存儲在磁盤上重用。

您可以使用NGEN.EXE預JIT你的應用程序...

這需要你運行該軟件的計算機上完成,因爲JIT編譯和優化運行它的CPU。你可以這樣做,因爲你的程序安裝的一部分...

+2

Paint.NET http://getpaint.net在安裝過程中執行此操作。它運作良好。 – BoltBait 2009-06-26 17:50:30

+0

在下面引用的頁面上,「如果您使用NGEN,則需要注意當本機映像加載到內存時可能發生重新綁定...如果您將多個DLL構建爲應用程序的一部分,則在加載應用程序時重新綁定將最終發生,因爲分配給每個DLL的默認基址始終相同(0x400000)。「 我們包含許多DLL作爲我們的主要應用程序(> 20)。我們仍然會看到一個好處嗎? – 2009-06-26 17:58:15

1

我有一種感覺的啓動延遲是在.NET運行時轉換MSIL到本地代碼。

你可能NGEN安裝在你的組件,這將他們編譯爲本地代碼 和將可能阻止啓動延遲。 WiX(http://wix.sourceforge.net)有一個自定義操作,就是這麼做的。

3

閱讀this(提高應用程序啓動時間),this(.NET Framework 3.5 SP1中的CLR優化)和this(NGen的性能優勢)。

改善啓動時間的主要思想是儘可能使用延遲初始化。不要在啓動後立即實例化那些不必要的東西。等,等,等

相關問題