2009-09-28 107 views
0

我在Windows上使用C++/CLI。這是一個使用/ clr構建的MFC應用程序。測量應用程序啓動性能

我想測試啓動應用程序需要多長時間。第一次花了10s,但後來花了4s,4s,5s。我假設這是由於Windows緩存DLL。

是否有一些工具可以讓我從緩存中刪除一個目錄,以便我的測試條件每次都一樣?我不想在測試之間重新啓動:)

+1

你正在使用什麼編程語言/平臺? .net中的啓動時間首先是最高的,因爲它僅在第一次運行時從CIL編譯,然後後續運行速度更快。 – 2009-09-28 14:09:46

+0

嗯,你是對的,我忘了那部分:)我會編輯 – demoncodemonkey 2009-09-28 14:13:59

+0

的問題......但我仍然希望能夠在不重啓的情況下重新創建10s結果(也許清除GAC緩存或什麼?) – demoncodemonkey 2009-09-28 14:17:17

回答

3

如果您使用.Net框架,那麼可能是那些等待框架初始化(加載mscoree.dll等)的6秒鐘。 CLR Inside Out: Improving Application Startup Performance是爲MSDN雜誌撰寫的文章。

冷啓動需要加載所有.Net Framework以及運行JIT編譯器以生成代碼。

在大多數情況下,冷啓動是I/O限制的。換句話說,等待數據花費的時間比花費在處理指令上花費的時間要多。啓動應用程序所用的時間等於操作系統從磁盤獲取代碼所需的時間,以及執行額外處理所需的時間,例如JITing IL代碼以及在啓動路徑中執行的任何其他初始化應用。由於處理通常不是冷啓動的瓶頸,因此任何應用程序啓動性能調查的初始目標都是通過減少加載的代碼量來減少磁盤訪問。

當您第二次啓動應用程序時,幾乎所有這些都完成了。即DLL被加載,它可能會提取以前編譯的代碼等。

爲了減少啓動時間,最好的辦法是在第一個窗口顯示之前減少.Net框架調用的數量(自所有這些都需要在運行之前進行編譯),並減少啓動程序所需的磁盤I/O數量。

一旦程序啓動並運行,來自.Net的任何未編譯的IL將在首次調用時由JIT編譯器編譯。另外,據我所知,一旦框架被加載,沒有一種簡單的方式卸載它,而無需重新啓動(如果你可以卸載它)。在加載框架之前讓虛擬機處於保存狀態可以大大減少「重新啓動」所需的時間。

+0

謝謝,我最終做了一個虛擬機,以避免重新啓動,但忘記標記這是直到現在接受的答案:) – demoncodemonkey 2009-11-17 22:56:17

0

什麼約書亞說,加上,看看this answer的第三段。

+0

好吧,你踢了我,現在都很酷:D – demoncodemonkey 2009-11-17 22:57:14

+0

@demon:對不起,我的代碼可能很快,但我很慢。我不明白。 – 2009-11-18 02:03:46