.NET 程序首先被编译为 MSIL 代码。当它被执行时,JIT编译器会将其编译为本机机器代码。
我想知道:
这些JIT编译的机器代码存储在哪里?它只存储在进程的地址空间中吗?但由于程序的第二次启动比第一次快得多,我认为即使在执行完成后,该本机代码也一定已存储在磁盘上的某个位置。但是哪里?
记忆。它can被缓存,这是 ngen.exe 的工作。它生成 .ni.dll 版本的程序集,包含机器代码并存储在 GAC 中。随后会自动加载,绕过 JIT 步骤。
但这与为什么你的程序第二次启动得更快没有什么关系。第一次出现所谓的“冷启动”。这完全取决于在硬盘上查找 DLL 所花费的时间。第二次热启动时,DLL 已在文件系统缓存中可用。
磁盘速度很慢。 SSD 是一个明显的解决方案。
Fwiw:这不是托管代码独有的问题。具有大量 DLL 的大型非托管程序也有它。大多数开发计算机上存在的两个典型示例是 Microsoft Office 和 Acrobat Reader。他们作弊。安装后,他们将“优化器”放入“运行”注册表项或“启动”文件夹中。这些优化器所做的就是加载主程序使用的所有 DLL,然后退出。这会启动文件系统缓存,当用户随后使用该程序时,由于其热启动速度很快,因此它将快速启动。
就我个人而言,我觉得这非常烦人。因为他们什么reallydo 会减慢我登录后可能想要启动的任何其他程序。很少是 Office 或 Acrobat。我会特别强调删除这些优化器,如果有必要,当一个被破坏的更新将其恢复时,会重复删除这些优化器。
你也可以使用这个技巧,但请负责任地使用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)