【问题标题】:Improve COM Interop Cold Start改进 COM 互操作冷启动
【发布时间】:2012-02-17 02:46:03
【问题描述】:

我们有一个 VB6 应用程序,它会在启动时启动我们的 .NET 代码。

在 Windows XP 机器上,冷启动持续大约需要 22 秒。在同一台机器上热启动大约需要 4 秒。

Windows Vista/7 冷启动大约需要 5 秒,热启动大约需要 3 秒。

基于上述情况,我假设延迟与磁盘访问有关,并且由于 SuperFetch,Vista/7 没有受到影响。

显然,我们需要提高 XP 的冷启动性能。我正在考虑创建一个在 Windows 启动时在系统托盘中运行的“预热”应用程序......但在我们付出努力之前,我想看看是否有任何其他建议。

我已经尝试过对我们的程序集进行更新,但这似乎没有任何区别。

添加一些跟踪代码后,我可以看到 VB6 代码跨越 .NET 边界只需要大约 1 秒...但 .NET 中的初始化代码大约需要 20 秒。它做了一些反思,我猜延迟是从磁盘加载 GAC 程序集......但我不能完全确定。

建议?

【问题讨论】:

  • 您确定不只是在使用 CLR 的较新机器上运行的东西并在引导或登录时有效地为您“预加载”它吗?我知道自从 ATI 收购了他们与视频适配器相关的 Catalyst 品牌软件后,其他供应商现在可能也在这样做。
  • 这不就是闪屏的用途吗:)
  • 是的,但是 20 秒的闪屏效果不太好......
  • 这是怎么复制的?我不是在问缓存在哪里...我是在寻求改进问题的建议...

标签: .net vb6 com-interop


【解决方案1】:

我会尝试以下方法:

  • 为您的 .NET 代码打造一个 .NET 前端。看看它是否需要相同的时间。如果不是(我对此表示怀疑),那么问题出在 Interop 上。
  • 由于交叉是在第二个内完成的,我将分析 .NET 代码。下载 Ants Profiler 试用版,看看问题出在哪里。
  • 最后,执行一些 ProcMon 操作以查看正在访问哪些文件 - 这可能会为您提供线索。

我不认为 GAC 库需要那么长时间来加载。我猜代码的反射比你想象的要多。

【讨论】:

  • 当然,我的反思确实比我想象的要多。谢谢。
猜你喜欢
  • 2010-12-14
  • 1970-01-01
  • 2011-04-13
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
相关资源
最近更新 更多