.NET中预先assembly程序集的优点和缺点是什么?

.NET中预先assembly程序集的优点和缺点是什么?

我听说预先咬合会提高性能。 什么时候应该预先jit,什么时候不应该预先jit?

“预先评估”或预编译将在启动时提高性能,因为您将跳过该步骤。 每次应用程序及其库加载时.NET JIT的原因是它可以在许多平台和体系结构上运行,并且无需管理构建。

因此,您必须权衡管理员是否值得在应用启动和库加载时节省几秒钟。 我认为执行此操作的最常见用例是服务器安装,您倾向于管理少量计算机并且环境非常稳定。 例如,您不会为客户端应用程序进行预编译,因为目标环境的可预测性要低得多。

你是在谈论NGen在执行之前生成assembly图像吗? 前JIT是一个矛盾,因为“JIT”意味着及时,就像在执行前一样。 如果你预编译某些东西,根据定义,它不是 JIT-ing。

优点是,当代码中第一次加载程序集或类型时,您没有JITter可能引入的初始编译延迟。 对于极端(可能是不明智的 )大型组件/类型,这可能很重要。

缺点包括无法优化某些只能根据运行时条件确定的事情以及必须维护图像的事实。 此外,使用预生成映像的所有应用程序和程序集(从.NET 4开始)都需要完全信任,CAS将被忽略。

有关NGen的更多信息,请参阅http://msdn.microsoft.com/en-us/library/6t9t5wcf.aspx

“PRE-JIT”是通过NGen (从CIL预编译到本机映像的过程)完成的。 它将编译后的.NET代码从独立于平台的中间状态转换为特定于平台的阶段。 简单来说,它将可以在Windows,Mac和Linux 32位和64位上运行的.NET应用程序转换为只能在其中一个上运行的旧式EXE文件 。

.NET应用程序被编译为一种称为MSIL的中间二进制格式,它与平台无关。 这意味着只要平台支持.NET,应用程序就可以在任何平台上由任何CPU运行。 .NET在执行期间执行的操作称为JIT。 JIT将在实际使用之前执行一次代码。 这也意味着只会编译使用的代码。

NGen将为您的应用程序提供性能提升(主要是启动时间),有时非常明显。 只要你瞄准正确的平台,NGen几乎可以安全。 例如,如果您的应用程序使用32位DLL文件,则不应将其设置为64位,如果您的DLL文件正被其他应用程序使用,则不应该使用它。

我建议安装运行NGen,而不是在分发之前运行NGen,以便您知道应用程序将在目标计算机上运行。

它可以改善程序的热启动时间。 热启动是程序集数据已经在文件系统缓存中的一个,因此磁盘驱动器没有花时间在磁盘上找到DLL。 与冷启动相反,磁盘驱动器必须首先找到该文件,但是当程序集从未在之前加载或很久以前加载时,您将获得冷启动。 这很慢。 你几乎总是只关心冷启动时间,因为这是用户非常注意的那个。

哪个是摩擦,ngen.exe创建了一个需要由磁盘驱动器找到的额外文件。 包含预设机器代码(.ni.dll)的那个。 可能使冷启动变慢。 对于’小’程序集,让JIT编译器jit代码实际上是有意义的,因为这可能比磁盘驱动器需要的时间少,以找到预先安装的DLL。 什么是’小’,盈亏平衡点,在很大程度上取决于磁盘驱动器可以寻找的速度和碎片状态。 你必须进行实验,但请记住,这在另一台机器上不会重复。 像这样的实验本身很难,你很容易得到一个温暖的开始。

当你说“pre-jitting”时,你可能意味着使用ngen.exe来预编译你的程序集?

使用ngen.exe没有任何实际缺点(除了一些额外的磁盘使用字节)。 但是,为了使用它,您要预编译的程序集必须位于GAC(全局程序集缓存)中。 但是,您需要管理员权限才能将它们带到那里。
因此,它不适合您希望通过复制和粘贴轻松部署的应用程序。

是的,使用ngen.exe可能会提高应用程序的性能(即使在运行时也可以在JIT编译期间跳过某些优化以节省编译时间)。 因此,尽可能使用ngen,尤其是对于您实际想要在本地安装的长期运行的应用程序和应用程序

我已经看到了执行决定论很重要的优势。 通常你需要避免像瘟疫这样的时间敏感执行。 有时这是不可避免的。 一种情况是与外部硬件交互时,某些行为是异步的,尤其是当有许多步骤是串行执行而不是重复执行时。 这意味着必须对每个步骤进行jitted,并且硬件同时执行自己的操作(异步通信)

我们总是在安装过程中使用我们的库。 我们的库访问不同的硬件设备,其中许多设备最初并不是为自动化而设计的。