在VB6 COM Interop下运行的UI性能问题

时间:2012-02-21 03:33:30

标签: wpf winforms vb6 com-interop

我们有一个VB6应用程序,它通过COM注册的.NET tlb启动我们的.NET代码。

在VB6进程下运行时启动的任何.NET UI(我们都有WinForms和WPF)首次出现非常。从我们的.NET测试客户端(只是一个简单的WPF应用程序)运行时,任何新窗口都会立即显示出来。

这里没有数据访问。新窗口/窗体出现所需的时间似乎与其上的控件数量相关。例如,一个空白的窗口/窗体会立即显示,但是一个带有5个或10个控件的窗口/窗体最多可能需要5秒钟。在VB6进程下运行时,我们的一些.NET表单/窗口最多需要10秒才能显示,这是不可接受的。

这似乎不是“整体应用程序预热”问题,因为每个不同的表单/窗口的延迟都是单独。换句话说,如果我在.NET中有Form1和Form2,则第一次显示Form1需要10秒。然后第一次显示Form2它也需要10秒。但是,随后在VB6过程的生命周期内启动相同的窗体/窗口始终是即时的。此外,热启动与冷启动似乎确实有所不同......但同样,它基于每个窗体/窗口。所以,如果我不热身Form1,那么显示Form2(在同一个.NET dll中)的性能仍然很差。

我已经将我的VS .NET调试器连接到VB6进程,发现几乎整整10秒都花在ShowDialog下的.NET内部(不在我的代码中)。

WPF和WinForms UI中的问题似乎同样存在。

有关如何进一步排查问题的任何想法?

2 个答案:

答案 0 :(得分:0)

我怀疑几乎所有这些都是CLR启动延迟加上JIT编译延迟。这里的区别可能是您正在按需启动JIT编译器的实例,甚至可能是其他进程内CLR实例。

In-Process Side-by-Side

答案 1 :(得分:0)

是否有可能隐含地发生其他活动?你提到这个应用程序是WPF,它充斥着自动数据绑定等等。我会采取以下步骤:

  1. 启用SQL事件探查器,查看是否正在进行任何呼叫。
  2. 我会通过Ants探查器或内置探测器运行它,看看问题出在哪里。
  3. 启动ProcMon并查看正在访问的文件。
  4. 看看你是否能够组装。这个问题会消失吗?如果是这样,它可能是JIT编译器,但我怀疑是这种情况。
  5. 我真的不认为问题是Interop。