【发布时间】:2023-04-02 18:25:02
【问题描述】:
即使是带有简单窗口的最基本应用程序也需要几秒钟才能启动,而其 Win32 等效应用程序会在瞬间加载。
我读到延迟不是由于 JIT 将操作码转换为机器码所花费的时间,而是由于 Windows 加载 .Net 框架所花费的时间。
所以,使用 MS 的 tasklist.exe CLI 应用程序,我检查了 mscoree.dll 是否已经加载:
C:\>tasklist /m mscoree.dll
Image Name PID Modules
========================= ====== =====================
explorer.exe 368 mscoree.dll
BSQLServer.exe 652 mscoree.dll
TOTALCMD.EXE 408 mscoree.dll
Uedit32.exe 260 mscoree.dll
OUTLOOK.EXE 1912 mscoree.dll
接下来,我只用一个确定按钮运行了我的基本应用程序,但仍然需要几秒钟才能显示出来。
假设 mscoree.dll 确实是 .Net 已加载的证据,至少可以处理基本的 Windows,那么为什么会延迟? FWIW,它在 XPSP3 主机上。
即使为每个进程加载了整个 .Net 框架,因为它已经为其他进程启动并运行,我假设它只会从 RAM 中的其他进程复制代码?
谢谢。
编辑:似乎较慢的初始启动时间是由于使用了防病毒/防火墙应用程序,而不是由于 JIT 或加载 .Net。另一个可能的问题:如果您的应用从冷状态启动有点慢,请确保它仅在启动时加载最低限度。
【问题讨论】:
-
你是如何运行这个应用的,它是什么类型的应用?您是否尝试过从命令行运行的简单控制台应用程序(仅作为最小测试)?
-
您可以尝试使用Process Monitor 来查看实际发生的情况,直到您看到应用程序的 UI。这将包括 DLL 加载、文件和/或网络访问等事件。
-
由于问题中明显冲突/不正确的信息而难以回答。谁告诉你最初的延迟不是 JIT 造成的?
-
只需检查您是否已在发布模式下编译应用程序
-
它只是一个带有 OK 按钮的窗口,它是 Release 二进制文件。我在几个地方读到过,包括在 MS 自己的网站上,JIT 非常快,所以启动时间较慢主要是由于其他因素。这是否意味着 .Net 应用程序可以像 Win32 应用程序一样快速启动,即使在 JIT + 加载 .Net 的情况下也是如此?