我们有一个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中的问题似乎同样存在。
有关如何进一步排查问题的任何想法?
答案 0 :(得分:0)
我怀疑几乎所有这些都是CLR启动延迟加上JIT编译延迟。这里的区别可能是您正在按需启动JIT编译器的实例,甚至可能是其他进程内CLR实例。
答案 1 :(得分:0)
是否有可能隐含地发生其他活动?你提到这个应用程序是WPF,它充斥着自动数据绑定等等。我会采取以下步骤:
我真的不认为问题是Interop。