我注意到,有時.net 4.0 c#應用程序需要很長時間才能啓動,沒有任何明顯的原因。我可以確定實際發生了什麼,加載了哪些模塊?我正在使用一些外部程序集。可以將它們放入GAC以提高性能嗎?測量啓動性能c#應用程序
.NET 4比.NET 2慢嗎?
謝謝。
我注意到,有時.net 4.0 c#應用程序需要很長時間才能啓動,沒有任何明顯的原因。我可以確定實際發生了什麼,加載了哪些模塊?我正在使用一些外部程序集。可以將它們放入GAC以提高性能嗎?測量啓動性能c#應用程序
.NET 4比.NET 2慢嗎?
謝謝。
我不認爲把你的程序集放入GAC會啓動性能。 如果可能的話,記錄每一條寫在加載或初始化事件上的指令,這可能會幫助您識別哪個語句實際上需要時間,並且可以識別正在加載時需要花費時間的庫。
我讀過安裝在GAC中的程序集(我有很多依賴於Devexpress使用的UI組件的依賴項)減少啓動時間,因爲所有組件的簽名都需要驗證。那是對的嗎? – 2011-06-10 16:40:56
@Andera在某種程度上你是對的,但是它不會給你帶來相當大的提升,你正在尋找的表現。我認爲它會使表現提高15-20%。你在項目中使用企業庫嗎? – Deepesh 2011-06-10 18:25:14
啓動時間很可能是由於運行時JIT將程序集IL編譯到機器代碼中執行的。它也可能受調試器的影響 - 正如另一位回答者所建議的那樣。
不包括 - 我將談論一個應用程序運行「野生」用戶的機器上,沒有調試等
JIT編譯器在.NET 4的是,我認爲這是公平地說,比.Net 2更好 - 所以不會;它並不慢。
您可以通過在您的應用程序的程序集上運行ngen來顯着改善啓動時間 - 這會將EXE和DLL預編譯爲本機圖像。但是,通過這樣做你會失去一些靈活性,而且一般來說沒有太大意義。
您應該可以看到用C++編寫的一些MFC應用程序的啓動時間 - 所有本機代碼,然而取決於它們如何鏈接,它們可以持續很長時間。
它當然也取決於應用程序在啓動時實際做了些什麼!
.NET程序有兩種截然不同的啓動行爲。他們被稱爲冷啓動和熱啓動。冷啓動是一個很慢的啓動,當沒有.NET程序啓動之前,你會得到它。或者當你開始的程序很大,從來沒有運行過。操作系統必須在磁盤上找到程序集文件,它們在文件系統高速緩存(RAM)中不可用。這需要一段時間,硬盤速度很慢,並且有很多文件可供查找。一個小的無所事事Winforms應用程序必須加載51個DLL才能開始。一個什麼也不做的WPF應用程序在77個DLL中佔有重要地位。
當不久以前加載程序集文件時,您將獲得熱烈的開始。彙編文件數據現在來自RAM而不是慢速磁盤,這就是zippedy-doodah。唯一的啓動開銷現在是抖動。
對於冷啓動幾乎沒什麼可做的,程序集必須以某種方式來到磁盤。快速磁盤有很大的不同,SSD特別有效。使用ngen.exe預先裝配一個程序集實際上會使問題變得更糟,它會創建另一個需要找到並加載的文件。這是微軟建議而不是 prejitting小組件的原因。用.NET 4程序看到這個問題也很明顯,你沒有很多綁定到版本4 CLR和框架程序集的程序。無論如何,這隨着時間的推移而解決。
還有另一種方法會自動消失。 Windows SuperFetch功能將開始注意到您經常加載CLR和jitted Framework程序集,並且會開始自動將它們預加載到RAM中。與Microsoft Office和Adobe Reader的'優化器'使用相同的技巧。他們也是有很多DLL依賴項的程序。非託管的,這個問題不是特定於.NET的。這些優化器很粗糙,它們會在您登錄時預加載DLL。哪個是'我非常重要,用其他方式'來解決這個問題,確保你禁用它們,這樣它們就不會擠出SuperFetch可以使用的RAM空間。
如何跟蹤發生了什麼?我注意到主窗體的構造函數需要很多時間才能執行(特別是InitializeComponents),但這種情況在應用程序每次啓動時都不會發生,並且通常在啓動時需要更多的時間。 – 2011-06-10 16:42:12
在調試器下運行時,Activator.CreateInstance在.NET 4上運行速度非常慢。 – leppie 2011-06-10 11:54:09