冷启动和冷启动的JIT与NGen

时间:2012-06-22 11:15:42

标签: .net jit ngen

我想了解JIT和NGen之间的区别,请帮助我。 JIT是否缓存二进制代码?如果是的话,这意味着NGen只能提高冷运行性能。但是我读过一些相反的文章:NGen只会改善温暖的创业。

2 个答案:

答案 0 :(得分:1)

恰恰相反。冷启动比热启动花费的时间更长,因为程序集不在文件系统缓存中,需要在磁盘上找到。在机械磁盘驱动器上可能会非常慢。 NGen在磁盘上为每个ngen-ed程序集创建一个 extra 文件,这是一个包含预先编译的机器代码的.ni.dll文件。需要找到此文件并将加载到原始程序集中,大致使该特定程序集的冷启动成本翻倍。

因此,通过设计,NGen只能可靠地改善程序的热启动,恶化冷启动的部分,使其变慢。如果启动时抖动所花费的时间超过查找.ni.dll文件所需的时间,那么您将只能在冷启动情况下领先。当然这很难预测,因为它在很大程度上取决于磁盘性能并且非常难以测量,因为在开始转暖之前你只有一次射击。

你必须要做实验。一个粗略的指导是,当组件存储在GAC中并在多个进程中使用时,组件应该是“实质性的”,因为这允许将预先编码的代码加载到RAM中仅一次用于多个进程。

答案 1 :(得分:0)

.NET JIT不会跨进程缓存机器代码(我怀疑出于安全性和正确性原因 - 程序集可以更改,并且可以编辑存储的机器代码。这些是难以解决的问题)。每个进程都会重新创建机器代码。

正因为如此,NGEN改善了冷启动和热启动的加载时间。