2

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

4

2 回答 2

1

恰恰相反。冷启动比热启动需要更长的时间,因为程序集不在文件系统缓存中,需要在磁盘上找到。这在机械磁盘驱动器上可能会很慢。NGen 会在磁盘上为每个经过 ngen 编辑的程序集创建一个额外的文件,这是一个包含预编译机器代码的 .ni.dll 文件。除了原始程序集之外,还需要找到并加载此文件,这大约使该特定程序集的冷启动成本增加了一倍。

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

你必须进行实验。粗略的指导是,当程序集存储在 GAC 中并在多个进程中使用时,该程序集应该是“大量的”,并有额外的理由对 ngen 进行处理,因为这仅允许将预编译的代码加载到 RAM 中一次以用于多个进程。

于 2012-06-22T13:43:18.587 回答
0

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

因此,NGEN 缩短了冷启动和热启动的加载时间。

于 2012-06-22T12:12:55.227 回答