在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
NGen.exe工具(本机映像生成器)随.NET Framework一起发布,用来在客户机上安装应用程序时,将IL代码编译为本地代码。由于代码在安装时已经编译了,运行时JIT编译器就无需再次编译,这可以提升程序性能。
当安装程序对应用程序或单独的程序集调用NGen.exe时,应用程序所用的程序集或那个指定的程序集的IL代码将被编译为本地代码。NGen.exe将生成一个仅包含本地代码的新的程序集文件(不包含IL代码)。这个新的文件位于类似C:\Windows\Assembly\NativeImages_v4.0.#####_64这样的目录下。目录名称包含CLR版本,以及本地代码编译为x86、x64还是Itanium。 现在,当CLR加载程序集文件时,会先查找是否存在相应的NGen后的本地文件。如果没找到,CLR即时编译IL代码。如果存在,CLR将使用已存在的本地文件,并且在运行时不再需要编译文件中的方法。 表面上开来,你好像即得到了托管代码的好处(垃圾回收、验证、类型安全等),又避免了性能问题(JIT编译),似乎很棒。但其实有很多潜在问题:
因此,慎用NGen。 对于服务器端应应用,NGen几乎没有意义,因为只有第一次请求会损害性能。而且对于服务器应用,只需要一个代码实例,不需要工作组。NGen生成的映像不能跨应用程序域。类似ASP.NET这种需要跨应用程序域的程序集就没必要NGen了。 对于客户端应用,NGen会改善程序启动时的性能减少工作组,如果程序集同时用于多个程序的话。即使程序集没有用于多个程序,NGen仍然能够改善工作组。此外,如果所有客户端程序都使用NGen,CLR就没有必要加载JIT编译器,这能进一步减少工作组。当然只要一个程序集没有使用NGen或者不能使用NGen,JIT编译器都将加载,并增加工作组。 |
请发表评论