代码之家  ›  专栏  ›  技术社区  ›  Hannoun Yassir

您使用过ngen.exe吗?

  •  46
  • Hannoun Yassir  · 技术社区  · 15 年前

    这里有人用过恩根吗?哪里?为什么?是否有任何性能改进?何时何地使用它有意义?

    8 回复  |  直到 6 年前
        1
  •  19
  •   Peter Tate    6 年前

    是的,我看到了性能的提高。我的测量结果表明,如果我也将程序集放入GAC中,它确实提高了启动性能,因为我的程序集都是强名称的。如果您的程序集具有强名称,那么ngen在不使用GAC的情况下不会有任何区别。这样做的原因是,如果有不在GAC中的强名称程序集,.NET运行时通过从磁盘加载整个托管程序集来验证强名称程序集是否未被篡改,这样它就可以验证强名称程序集,从而绕过NGen的一个主要好处。

    对于我的应用程序来说,这不是一个很好的选择,因为我们依赖于公司的公共程序集(也有很强的名称)。公共程序集被许多使用许多不同版本的产品使用,将它们放入GAC意味着如果我们的应用程序之一没有说某个公共程序集的“使用特定版本”,它将加载GAC版本,而不管其执行目录中的版本是什么。我们认为恩根的利益不值得冒险。

        2
  •  30
  •   Marc Gravell    15 年前

    我不是每天都使用它,但是它被那些想要提高性能的工具所使用;例如,paint.net在安装过程中使用ngen(或者可能是第一次使用)。有些MS工具也有可能(尽管我不确定)。

    基本上,ngen在组装前执行大部分的JIT,因此冷启动的延迟很小。当然,在大多数典型的用法中,从来没有100%的代码被达到,所以在某些方面,这做了很多 不必要的 工作-但不能提前告诉你。

    缺点是,IMO,您需要使用GAC来使用NGEN;我尽量避免使用GAC,这样我可以使用Robocopy部署(到服务器)和ClickOnce(到客户机)。

        3
  •  8
  •   Delta76    15 年前

    ngen主要减少.NET应用程序的启动时间和应用程序的工作集。但它有一些缺点(从clr到jeffrey richter的c_):

    无知识产权保护

    ngen'd文件可能不同步

    较低的加载时间性能(重新定位/绑定)

    执行时间性能差

    由于刚刚列出的所有问题,在考虑使用 NGen.exe。对于服务器端应用程序,ngen.exe几乎毫无意义,因为只有 第一个客户机请求遇到性能问题;未来的客户机请求以高速运行。在 另外,对于大多数服务器应用程序,只需要代码的一个实例,因此没有 工作福利。

    对于客户端应用程序,ngen.exe可能有助于提高启动时间或减少 多个应用程序同时使用程序集时的工作集。即使在案件中 如果一个程序集不被多个应用程序使用,则生成一个程序集可以改进 工作集。此外,如果ngen.exe用于客户端应用程序的所有程序集,则clr 完全不需要加载JIT编译器,从而进一步减少工作集。当然,如果 只有一个程序集不是ngen'd,或者如果无法使用程序集的ngen'd文件,则使用jit编译器 将加载,应用程序的工作集将增加。

        4
  •  7
  •   Mehrdad Afshari    15 年前

    ngen 以提高启动时间(通过消除JIT编译)而闻名。它可能会改进(通过减少JIT时间)或降低应用程序的整体性能(因为某些JIT优化将不可用)。

    .NET框架本身使用 NGEN 用于安装时的许多组件。

        5
  •  1
  •   Raj    15 年前

    我使用它只是为了研究。只有在确定部署环境的CPU体系结构(它不会改变)时才使用它。

    但是让我告诉您,JIT编译并不太糟糕,如果您在多个CPU环境(例如经常更新的Windows客户机应用程序)中进行部署,那么就不要使用NGEN。这是因为有效的NGEN缓存依赖于许多属性。如果其中一个失败,您的程序集将再次返回到JIT

    在这种情况下,JIT显然是一个胜利者,因为它根据运行在其上的CPU体系结构实时优化代码。(例如,它可以检测是否有超过1个CPU)

    而且,clr在每个版本中都会变得更好,所以简而言之,坚持使用jit,除非您完全确信部署环境——即使这样,您的性能提升也很难证明使用ngen.exe(可能只需几百毫秒)是合理的——imho——这不值得付出努力。

    同时检查这个关于这个主题的链接。- JIT Compilation and Performance - To NGen or Not to NGen?

        6
  •  0
  •   Matthieu kelly    10 年前

    对。用于WPF应用程序以加快启动时间。启动时间从9秒到5秒。在我的 blog :

    我最近发现恩根在表演上有多出色。这个 我目前工作的应用程序有一个数据访问层(DAL),即 生成。数据库模式非常大,我们还生成 一些数据(值列表)直接进入DAL。结果:许多 具有许多字段和方法的类。经常显示的JIT开销 分析应用程序时启动,但在搜索JIT编译之后 而恩根一号虽然不值得。安装时间开销 管理我的主要关注点,使我忽略了这些迹象,专注于 而是向应用程序添加更多功能。当我们改变 _任何CPU_在64位机器上运行的体系结构都会变得更糟: 我们的应用程序在 单个语句,探查器只显示 问题区域。恩根解决了这个问题:声明从10开始 秒到1毫秒。这个声明不是 启动程序,所以我很想找出整个 应用程序可能会影响启动时间。从8秒到 3.5秒。

    结论:我真的建议对恩根的申请进行一次尝试!

        7
  •  0
  •   Community Egal    7 年前

    作为MehrdadAfshari对JIT编译的评论的补充。如果通过XmlSerializer对具有许多属性的类进行序列化,并且在64位系统上使用sgen,则ngen组合可能具有 巨大的 (在我们的例子中是千兆字节和分钟)效果。

    更多信息在这里: XmlSerializer startup HUGE performance loss on 64bit systems 尤其要看尼克·马蒂什琴科的回答。

        8
  •  0
  •   maf-soft    8 年前

    是的,我用一个小的单CPU密集型的exe进行了尝试,而用ngen则稍微慢一点!

    我多次安装和卸载了NGEN映像,并运行了一个基准测试。

    我总是得到以下可复制的时间+/-0.1秒: 33.9s, 35.3S