Portable 和 win-x64 在部署时有什么区别?
What are differences between Portable and win-x64 when deploying?
我将我的代码部署到 Windows Server 2016 上的 IIS,我试图了解在 Publish/Settings/Target 运行时下拉列表中选择 Portable
与 win-x64
之间的有效区别.
在 Portable 下站点启动时间会不会更长,因为 JIT 需要将代码编译到特定的体系结构?还有别的事吗?
编辑 - 简答
如果您选择portable
,每次应用程序启动时,都需要对应用程序实际执行的部分进行JIT 编译。如果您的应用程序很大,性能可能会受到影响。
如果您选择 x64
,应用程序不会因编译而变慢,因为构建机器(您的笔记本电脑)上的发布过程已经完成了。
原答案
当您选择 Portable
发布选项时,您将获得一个能够 运行 在 x86(32 位)机器和 x64(64 位)机器上运行的包.选择便携选项后,在应用程序启动时,您将获得针对目标机器(x64 或 x86)的 JIT 编译代码,因为应用程序保持 运行ning。但是,如果应用程序关闭,所有经过 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
已接受的答案在 Visual Studio 2022 年不再正确。
明显的区别是一个是可移植的,而另一个是针对特定架构的。
不太明显的区别是,当您 select win-x64 时,您会看到“启用 ReadyToRun 编译”选项。
但是,ReadyToRun 并不总是意味着更快。请参阅文档 here 了解具体细节。
简而言之,当 ReadyToRun 被 select 编辑时,编译器会尝试尽可能地编译它,但它没有实际机器的细节 运行在。因此,文件大小相当大,高达 2-3 倍。文档的建议是将它用于大型项目,而不是用于小型项目,但你必须自己决定大和小的定义。
我的建议是 select 如果您事先知道具体的体系结构将是什么。至于 ReadyToRun,select 如果测试表明它对启动时间有益(如果这很重要的话)。
我将我的代码部署到 Windows Server 2016 上的 IIS,我试图了解在 Publish/Settings/Target 运行时下拉列表中选择 Portable
与 win-x64
之间的有效区别.
在 Portable 下站点启动时间会不会更长,因为 JIT 需要将代码编译到特定的体系结构?还有别的事吗?
编辑 - 简答
如果您选择portable
,每次应用程序启动时,都需要对应用程序实际执行的部分进行JIT 编译。如果您的应用程序很大,性能可能会受到影响。
如果您选择 x64
,应用程序不会因编译而变慢,因为构建机器(您的笔记本电脑)上的发布过程已经完成了。
原答案
当您选择 Portable
发布选项时,您将获得一个能够 运行 在 x86(32 位)机器和 x64(64 位)机器上运行的包.选择便携选项后,在应用程序启动时,您将获得针对目标机器(x64 或 x86)的 JIT 编译代码,因为应用程序保持 运行ning。但是,如果应用程序关闭,所有经过 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
已接受的答案在 Visual Studio 2022 年不再正确。
明显的区别是一个是可移植的,而另一个是针对特定架构的。
不太明显的区别是,当您 select win-x64 时,您会看到“启用 ReadyToRun 编译”选项。
但是,ReadyToRun 并不总是意味着更快。请参阅文档 here 了解具体细节。
简而言之,当 ReadyToRun 被 select 编辑时,编译器会尝试尽可能地编译它,但它没有实际机器的细节 运行在。因此,文件大小相当大,高达 2-3 倍。文档的建议是将它用于大型项目,而不是用于小型项目,但你必须自己决定大和小的定义。
我的建议是 select 如果您事先知道具体的体系结构将是什么。至于 ReadyToRun,select 如果测试表明它对启动时间有益(如果这很重要的话)。