2012-02-15 68 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