若是您是.NET性能的粉丝,最近有不少好消息,例如.NET Core 2.1中的性能改进和宣布.NET Core 2.1,但咱们还有更多的好消息。分层编译是一项重要的新特性功能,咱们能够做为预览供任何人试用,从.NET Core 2.1开始。在咱们测试的许多场景中,应用程序启动更快,而且在稳定状态下运行得更快。一个在.NET Core 2.1上运行的项目,以及对环境变量或项目文件进行微不足道的更改以启用它。在本文的其他部分,咱们将介绍它是什么,如何使用它,以及为何它是2.1版本的隐藏技能!git
从.NET Framework开始,代码中的每一个方法一般都编译一次。可是,在决定如何进行会影响应用程序性能的编译时,须要进行权衡。例如,JIT能够进行很是积极的优化并得到很好的稳定性能,可是优化代码并非一件容易的事情,所以您的应用程序启动速度很是慢。或者JIT可使用很是简单的编译算法,这些算法能够快速运行,所以您的应用程序能够快速启动,但代码质量会更差,而且应用程序吞吐量会受到影响。.NET一直试图采用一种平衡的方法,在启动和稳定性能方面作得很合理,但使用单一编译意味着须要妥协。github
分层编译功能经过容许运行时热交换技术对.NET进行屡次编译同一个方法改变了以上前提。两套机制的分离以便咱们能够选择最适合启动的技术,选择最稳定状态而且在二者上都表现出更好性能的第二种技术(分层编译)。在.NET Core 2.1中,这就是Tiered Compilation旨在为您的应用程序作的事情:算法
咱们将此做为预览版发布的部分缘由是要了解它对您的应用程序的执行状况,但如下是咱们对其进行测试的一些示例。虽然很是依赖于场景,但咱们但愿这些结果是您在相似工做场景上的典型表明,而且随着功能的成熟,结果将继续改进。基准测试是在默认配置下运行的.NET Core 2.1 RTM,而且全部数字都通过缩放,所以基准始终为1.0。在第一组中,咱们有几个Tech Empower测试和MusicStore(用来专门测试的项目),这是咱们经常使用的ASP.NET应用示例。json
虽然咱们的一些ASP.NET基准测试得益于特别好(MvcPlaintext RPS超过60% - 哇!),但分层编译并不特定于ASP.NET。如下是您在平常开发中可能遇到的一些示例.NET Core命令行应用程序:数据结构
你的应用程序将如何运做?测量比预测要容易得多,但咱们能够提供一些普遍的经验法则。app
一个小免责声明,该功能仍然是一个预览。咱们已对其进行了大量测试,但默认状况下未启用此功能,由于咱们但愿收集反馈并继续进行调整。打开它可能不会使你的应用程序更快,或者你可能遇到咱们没有覆盖到的地方。若是遇到问题,微软随时为您提供帮助,您能够随时轻松将其禁用。若是您愿意,能够在生产中启用此功能,但咱们强烈建议您事先进行测试。框架
有几种方式能够选择加入此功能,全部这些方法都具备相同的效果:工具
此GitHub 连接可找到如下代码性能
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.1</TargetFramework> <TieredCompilation>true</TieredCompilation> </PropertyGroup> </Project>
{ "runtimeOptions": { "configProperties": { "System.Runtime.TieredCompilation": true } }, "framework": { ... } }
COMPlus_TieredCompilation=1
有关尝试和测量性能的更多详细信息,请查看分层编译演示测试
好奇它是如何工做的?不要惧怕,理解这些内部细节不是使用分层编译所必需的,若是您愿意,能够跳过本节。一目了然,该功能可分为四个不一样的部分:
分层编译创造了各类可能性,咱们能够继续充分利用将来的时间。既然运行时能够利用更极端的状况,那咱们就有了扩展边界的动力,既能够加快编译速度,又能够生成更高质量的代码。经过代码的运行时热更新,.NET能够进行更详细的分析,而后使用运行时反馈来进行更好的优化(配置文件引导优化)。这些技术能够容许代码生成器甚至超出没法访问配置文件数据的最佳静态优化器。或者还有其余选项,例如用于更好诊断的动态去优化,用于减小内存使用的可收集代码,以及用于性能检测或服务的热补丁。目前,咱们最直接的目标仍然接近实际 - 确保预览中的功能运行良好,响应您的反馈,并完成工做的第一次迭代。
咱们但愿Tiered Compilation为您的应用程序提供与咱们的基准测试相同的重大改进,而且咱们知道还有更多还没有开发的潜力。请试一试,而后访问github,向咱们提供反馈,讨论,提问,甚至能够贡献一些本身的代码。谢谢!
原文:.NET Core 2.1中的分层编译(预览)