【问题标题】:JIT vs. NGen for cold and warm startupJIT 与 NGen 的冷启动和热启动
【发布时间】:2012-06-22 11:15:42
【问题描述】:

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

【问题讨论】:

  • “我读过一些文章” - 哪些文章?
  • 最好是测试。对于 10% 的冷启动提升,我不会打扰,但就像我使用 IronScheme 的情况一样,这是一个巨大的改进(3 秒以上对 0.1 秒)。仍然很想知道为什么会这样;p

标签: .net jit ngen


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-12
      • 1970-01-01
      • 2021-12-05
      • 2011-04-13
      • 2020-03-18
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      相关资源
      最近更新 更多