.NET中预先装配程序集的优点和缺点是什么?
我听说预先咬合会提高性能。什么时候我应该预先jit,什么时候不应该预先jit?
答案 0 :(得分:6)
“预先评估”或预编译将提高性能,在启动时,因为您将跳过该步骤。每次应用程序及其库加载时.NET JIT的原因是它可以在许多平台和体系结构上运行,并且无需管理构建就可以实现最佳优化。
因此,您必须权衡管理员是否值得在应用启动和库加载时节省几秒钟。我认为这样做最常见的用例是服务器安装,你倾向于管理很少的机器,环境非常稳定。例如。您不会为客户端应用程序进行预编译,因为目标环境的可预测性要低得多。
答案 1 :(得分:4)
你是在谈论NGen在执行前生成装配图像吗?前JIT是一个矛盾,因为“JIT”意味着及时,就像在执行之前一样。如果您预先编译某些内容,那么根据定义,不 JIT-ing。
优点是,当代码中第一次加载程序集或类型时,您没有JITter可能引入的初始编译延迟。对于极端(可能是不明智的)大型装配/类型,这可能很重要。
缺点包括无法优化某些只能根据运行时条件确定的事情以及必须维护图像的事实。此外,所有使用预生成映像的应用程序和程序集(从.NET 4开始)都需要完全信任,CAS将被忽略。
有关NGen的更多信息,请参阅http://msdn.microsoft.com/en-us/library/6t9t5wcf.aspx
答案 2 :(得分:4)
“PRE-JIT”通过NGen(从CIL预编译到本机映像的过程)完成。它将编译的.NET代码从独立于平台的中间状态转换为特定于平台的阶段。简单来说,它将可以在Windows,Mac和Linux 32位和64位上运行的.NET应用程序转换为只能在其中一个上运行的旧学校EXE file。
.NET应用程序被编译为一个名为MSIL的中间二进制格式,与平台无关。这意味着只要平台支持.NET,应用程序就可以在任何平台上由任何CPU运行。 .NET在执行期间执行的操作称为JIT。 JIT将在实际使用之前每次执行一次编译代码。这也意味着只会编译使用的代码。
NGen将为您的应用程序提供性能提升(主要是启动时间),有时非常明显。只要你瞄准正确的平台,NGen就是安全的。例如,如果您的应用程序使用32位DLL文件,则不应将其设置为64位,如果您的DLL文件正被其他应用程序使用,则不应该使用它。
我建议在安装后运行NGen ,而不是在分发之前运行,以便您知道应用程序可以在目标计算机上运行。
答案 3 :(得分:2)
它可以改善程序的热启动时间。热启动是程序集数据已经在文件系统缓存中的一个,因此磁盘驱动器没有花时间在磁盘上找到DLL。与冷启动相反,磁盘驱动器必须首先找到文件,然后才能在程序集之前从未加载或加载之前获得。这很慢。你几乎总是只关心冷启动时间,因为这是用户非常注意的那个。
摩擦是什么,ngen.exe创建了一个需要由磁盘驱动器找到的额外文件。包含预设机器代码(.ni.dll)的那个。可能使冷启动变慢。对于'小'程序集,让JIT编译器jit代码实际上是有意义的,因为这可能比磁盘驱动器需要的时间少,以找到预先安装的DLL。究竟什么是'小',盈亏平衡点,在很大程度上取决于磁盘驱动器可以寻求的速度和碎片状态。你必须进行实验,但请记住,这在另一台机器上不会重复。像这样的实验本身很难,你很容易获得一个温暖的开始。
答案 4 :(得分:0)
当您说“pre-jitting”时,您可能意味着使用ngen.exe预编译程序集?
使用ngen.exe没有任何实际缺点(磁盘使用的一些额外字节除外)。但是,为了使用它,您要预编译的程序集必须位于GAC(全局程序集缓存)中。但是,您需要管理员权限才能将它们带到那里。
因此,它不适合您希望通过“复制和粘贴”轻松部署的应用程序。
是的,使用ngen.exe可能会提高应用程序的性能(即使在运行时也可以在JIT编译期间跳过某些优化以节省编译时间)。因此,尽可能使用ngen,尤其是对于您实际想要在本地安装的长期运行的应用程序和应用程序
答案 5 :(得分:0)
我已经看到了执行决定论很重要的优势。通常你需要避免像瘟疫这样的时间敏感执行。有时这是不可避免的。一种情况是与外部硬件交互时,某些行为是异步的,特别是当有许多步骤连续执行而不是重复执行时。这意味着必须对每个步骤进行jitted,并且硬件同时进行自己的操作(异步通信)
我们总是在安装过程中使用我们的库。我们的库访问不同的硬件设备,其中许多设备最初并不是为自动化而设计的。