2012-02-15 89 views
1

我們有一個VB6應用程序,可以在啓動時啓動我們的.NET代碼。改進COM Interop Cold Start

冷啓動在Windows XP機器上需要持續約22秒。同一臺機器上的熱啓動約爲4秒鐘。

對於冷啓動,Windows Vista/7大約需要5秒,對於熱啓動大約需要3秒。

基於以上所述,我假設延遲是與磁盤訪問相關的,並且由於SuperFetch,Vista/7不受影響。

顯然,我們需要提高XP的冷啓動性能。我正在考慮創建一個在Windows啓動時在系統托盤中運行的「熱身」應用程序......但在我們花費精力之前,我想查看是否還有其他建議。

我已經試過ngen'ing我們的程序集,似乎沒有任何區別。

在添加了一些跟蹤代碼後,我發現VB6代碼只需要1秒左右就可以跨越.NET邊界......但.NET中的初始化代碼大約需要20秒。它做了一些反思,我猜想延遲是從磁盤加載GAC程序集......但我不能完全確定。

對此提出建議?

+0

[.NET JIT編譯的代碼是否被緩存了?在哪裏?](http://stackoverflow.com/questions/3295622/is-the-net-jit-compiled-code-cached-where) – 2012-02-15 05:07:07

+0

你確定沒有簡單的東西你運行在較新的機器(s ),它使用CLR並在啓動或登錄時有效地「預加載」它?我知道,自從ATI收購了與視頻適配器相關的Catalyst品牌軟件之後,其他供應商也可能會這樣做。 – Bob77 2012-02-15 05:41:29

+0

是不是什麼閃屏:) – tcarvin 2012-02-15 15:25:38

回答

2

我會嘗試以下方法:

  • 曲柄出你的.NET代碼.NET前端。看看它是否需要相同的時間。如果沒有(我懷疑它),那麼問題在於Interop。
  • 因爲交叉是在第二個內完成的,所以我會描述.NET代碼。下載Ants Profiler的試用版並查看問題出在哪裏。
  • 最後,拋出一些ProcMon操作來查看哪些文件正在被訪問 - 這可能會給你一個線索。

我不需要GAC庫需要很長時間才能加載。我猜測代碼比你想象的要更加反思。

+0

當然,我的確在做比我想象的更多的反思。謝謝。 – Jeff 2012-02-16 17:34:30