2013-05-15 20 views
0

我試圖優化某些WinForms應用程序的冷啓動時間。我已經對所有程序集進行了NGen,但仍然看到JIT被調用。我已經啓用了MDA的jitCompilationStart,並查看MDA中的運行時異常,指出引發JIT的調用。託管調試助手(MDA)jitCompilationStart用法

我的問題是 - 現在是什麼?我看到的是建議的調試器列表。如果我從列表中選擇sthm - 我在VS中看不到任何東西。應用程序繼續執行,僅此而已。如何獲取有關應用程序的哪些部分調用JIT的信息?

enter image description here

我已經啓用JitCompilationStart在調試 - >例外 - >託管調試助手:

enter image description here

+0

你在調試器下運行你的代碼嗎?來自http://msdn.microsoft.com/en-us/library/d21c150d.aspx:「當MDA啓用時,即使代碼沒有在調試器下執行,它也是活動的。如果在事件發生時調試器不存在時,事件消息顯示在未處理的異常對話框中,但它不是未處理的異常。要避免此對話框,請在代碼未在調試環境中執行時刪除MDA啓用設置。 –

+0

@MarcSherman如果沒有附加調試器,則會出現異常對話框。如果我在啓動時將VS附加到WinForms進程上,那麼沒有任何異常對話框和應用程序沒有任何問題。但是我沒有看到MDA中的任何日誌或sthm。 – nikita

+0

從閱讀jitCompilationStart MDA聽起來它只是報告JIT事件,所以也許你成功地擺脫了它們。如果你用VS附帶了一個你的程序的版本,但是它根本沒有被修改,會發生什麼?你看到JIT事件嗎? –

回答

1

那MDA是爲了得到一個調試器附加抖動啓動時。要求是一個註冊的非託管調試器,它能夠調試C++代碼以及抖動的源代碼。您已經滿足了第一個要求,VS20120和VS2012具有出色的非託管調試器。後者對於你和我這樣的凡人來說是相當困難的。整個場景只對微軟的SDET感興趣。

很明顯,您正在錯誤地診斷冷啓動延遲。在多種方式中,抖動是溫暖開始細節。冷啓動主要由磁盤找到程序集文件所需的時間決定。使用Ngen實際上正是不需要想要做的事情,它使需要找到的文件數量翻倍。改善熱啓動時間只是一件好事。

冷啓動延時只有三種好的解決方案。使用更少的組件,ILMerge可以提供幫助。使用更快的磁盤,SSD有很大幫助。並作弊,在登錄時啓動一個小的無所作爲的.NET程序,將程序集加載到文件系統緩存中。在用戶啓動.NET應用程序一段時間後,這實際上是自動執行的,Windows prefetcher學習並預加載DLL。很難注意到,除了客戶在一段時間後停止投訴外。

+0

謝謝,更新的問題 - 錯誤的術語。當然溫暖啓動。無論如何,爲什麼我會在連接VS的小型秒殺應用程序中看到jitCompilationStart輸出,但在附帶VS的大應用程序中看不到任何MDA輸出。在大應用程序運行時有MDA異常。爲什麼他們沒有被附加VS捕獲? – nikita

+0

現在我已經發現異常。在創建通用集合方面是否存在一些問題? – nikita

+0

你已經完全無效,我的答案。你不能這樣做。再次單擊提問以詢問另一個問題。 –