【问题标题】:What are differences between Portable and win-x64 when deploying?部署时 Portable 和 win-x64 有什么区别?
【发布时间】:2019-05-20 11:59:35
【问题描述】:

我将我的代码部署到 Windows Server 2016 上的 IIS,我试图了解在 Publish/Settings/Target Runtime 下拉列表中选择 Portablewin-x64 之间的有效区别。

是否会因为 JIT 需要将代码编译到特定架构而在 Portable 下启动站点需要更长的时间?还有别的事吗?

【问题讨论】:

    标签: .net asp.net-core .net-core asp.net-core-2.2


    【解决方案1】:

    已接受的答案在 Visual Studio 2022 中不再适用。

    明显的区别是一个是可移植的,而另一个是针对特定架构的。

    不那么明显的区别是,当您选择 win-x64 时,您可以选择“启用 ReadyToRun 编译”。

    但是,ReadyToRun 并不总是意味着更快。有关详细信息,请参阅文档 here

    In a nutshell, when ReadyToRun is selected, the compiler attempts to compile it as best as it can, but it doesn't have the specifics of the actual machine it will run on.因此,文件大小要大得多,多达 2-3 倍。文档中的建议是将其用于大型项目,而不是用于小型项目,但您必须自己决定大小的定义。

    我的建议是,如果您事先知道会是什么,就选择具体的架构。至于ReadyToRun,如果测试表明它对启动时间很重要,请选择它。

    【讨论】:

      【解决方案2】:

      编辑 - 简短回答

      如果您选择portable,则应用程序每次启动时都需要对实际执行的应用程序部分进行 JIT 编译。如果您的应用程序很大,性能可能会受到影响。

      如果您选择x64,应用程序的编译速度不会减慢,因为构建机器(您的笔记本电脑)上的发布过程已经完成了。


      原答案

      当您选择 Portable 发布选项时,您将获得一个能够在 x86(32 位)机器和 x64(64 位)机器上运行的包。选择可移植选项后,在应用程序启动时,您将在应用程序保持运行时获得目标机器(x64 或 x86)的 JIT 编译代码。但是,如果应用程序关闭,所有 JIT 编译的代码都将丢失。编译后的代码会一直保存在内存中,直到应用程序进程结束。下一次运行必须在使用时再次 JIT 编译应用程序。这样做的好处是您只需要分发一个包,它就可以在两台 x86/x64 机器上运行。

      另一种方法是生成多个包,一个用于您打算在其上分发应用程序的每个目标平台。在这种情况下,您将获得已编译的特定于机器的包,即使在应用程序进程结束并稍后重新启动后也不需要重新编译。在这种情况下,您的应用程序将看起来运行得更快,因为编译只在构建服务器/机器上完成一次。但是,它确实会影响您的部署风格。

      更多关于 .NET 运行时标识符的信息可以在这里找到:https://docs.microsoft.com/en-us/dotnet/core/rid-catalog

      关于 JIT 编译代码的好文档在这里:https://www.telerik.com/blogs/understanding-net-just-in-time-compilation

      【讨论】:

      • 我对此表示怀疑。即使你使用win-x64,JIT 编译仍然应该是执行的一部分。 .NET Native 还不适用于 .NET Core,所以没有 AOT 可以替代 JIT。
      • 现在添加了一个复选框选项“启用 ReadyToRun 编译”,似乎更多的是关于这个回复的内容。而这个仅适用于特定于平台的目标。如果不选中它,我不确定目标有什么不同。
      猜你喜欢
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 2011-11-23
      • 2017-05-10
      • 2018-09-29
      • 2015-05-25
      相关资源
      最近更新 更多