.NET Core 2.1中的分层编译(预览)

如果您是.NET性能的粉丝,最近有很多好消息,例如.NET Core 2.1中的性能改进和宣布.NET Core 2.1,但我们还有更多的好消息。分层编译是一项重要的新特性功能,我们可以作为预览供任何人试用,从.NET Core 2.1开始。在我们测试的许多场景中,应用程序启动更快,并且在稳定状态下运行得更快。一个在.NET Core 2.1上运行的项目,以及对环境变量或项目文件进行微不足道的更改以启用它。在本文的其余部分,我们将介绍它是什么,如何使用它,以及为什么它是2.1版本的隐藏技能!

什么是分层编译?

从.NET Framework开始,代码中的每个方法通常都编译一次。但是,在决定如何进行会影响应用程序性能的编译时,需要进行权衡。例如,JIT可以进行非常积极的优化并获得很好的稳定性能,但是优化代码并不是一件容易的事情,因此您的应用程序启动速度非常慢。或者JIT可以使用非常简单的编译算法,这些算法可以快速运行,因此您的应用程序可以快速启动,但代码质量会更差,并且应用程序吞吐量会受到影响。.NET一直试图采用一种平衡的方法,在启动和稳定性能方面做得很合理,但使用单一编译意味着需要妥协。

分层编译功能通过允许运行时热交换技术对.NET进行多次编译同一个方法改变了以上前提。两套机制的分离以便我们可以选择最适合启动的技术,选择最稳定状态并且在两者上都表现出更好性能的第二种技术(分层编译)。在.NET Core 2.1中,这就是Tiered Compilation旨在为您的应用程序做的事情:

  • 更快的应用程序启动时间 - 当应用程序启动时,它会等待一些MSIL代码到JIT。分层编译要求JIT快速生成初始编译,如果需要,牺牲代码质量优化。之后,如果频繁调用该方法,则在后台线程上生成更优化的代码,并替换初始代码以保持应用程序的稳定性能。

  • 更快的稳定状态下的性能 - 对于典型的.NET Core应用程序,大多数框架代码将从预编译(ReadyToRun)映像加载。这对于启动非常有用,但预编译的映像具有版本控制约束和禁止某些类型优化的CPU指令约束。对于经常调用的这些镜像中的任何方法,分层编译请求JIT在后台线程上创建优化代码,以替换预编译版本。

更快?到底有多快?

我们将此作为预览版发布的部分原因是要了解它对您的应用程序的执行情况,但以下是我们对其进行测试的一些示例。虽然非常依赖于场景,但我们希望这些结果是您在类似工作场景上的典型代表,并且随着功能的成熟,结果将继续改进。基准测试是在默认配置下运行的.NET Core 2.1 RTM,并且所有数字都经过缩放,因此基准始终为1.0。在第一组中,我们有几个Tech Empower测试和MusicStore(用来专门测试的项目),这是我们常用的ASP.NET应用示例。

640?wx_fmt=png

640?wx_fmt=png

 

虽然我们的一些ASP.NET基准测试得益于特别好(MvcPlaintext RPS超过60% - 哇!),但分层编译并不特定于ASP.NET。以下是您在日常开发中可能遇到的一些示例.NET Core命令行应用程序:

640?wx_fmt=png

你的应用程序将如何运作?测量比预测要容易得多,但我们可以提供一些广泛的经验法则。

  1. 启动改进主要适用于减少管理托管代码的时间。您可以使用PerfView等工具来确定您的应用花费多少时间。在我们的测试中,jitting花费的时间通常会减少约35%。

  2. 稳定状态的改进主要适用于CPU绑定的应用程序,其中一些热代码来自.NET或ASP.NET预编译库。例如PerfView可以帮助您确定您的应用程序是这一类。

尝试一下

一个小免责声明,该功能仍然是一个预览。我们已对其进行了大量测试,但默认情况下未启用此功能,因为我们希望收集反馈并继续进行调整。打开它可能不会使你的应用程序更快,或者你可能遇到我们没有覆盖到的地方。如果遇到问题,微软随时为您提供帮助,您可以随时轻松将其禁用。如果您愿意,可以在生产中启用此功能,但我们强烈建议您事先进行测试。

有几种方式可以选择加入此功能,所有这些方法都具有相同的效果:

  • 如果使用.NET 2.1 SDK 自行构建应用程序 - 将MSBuild属性<TieredCompilation> true </ TieredCompilation>添加到项目文件中的默认属性组。例如:

此GitHub 链接可找到以下代码

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>netcoreapp2.1</TargetFramework><TieredCompilation>true</TieredCompilation></PropertyGroup></Project>
  • 如果运行已构建的应用程序,请编辑runtimeconfig.json以将System.Runtime.TieredCompilation = true添加到configProperties。例如:

  {      "runtimeOptions": {        "configProperties": {          "System.Runtime.TieredCompilation": true}},      "framework": {...}}
  • 如果您想运行应用程序但不想修改任何文件,请设置环境变量

COMPlus_TieredCompilation=1

有关尝试和测量性能的更多详细信息,请查看分层编译演示

获得这个技术

好奇它是如何工作的?不要害怕,理解这些内部细节不是使用分层编译所必需的,如果您愿意,可以跳过本节。一目了然,该功能可分为四个不同的部分:

  • JIT编译器可以配置为生成不同质量的汇编代码 - 令许多人惊讶的是,到目前为止,这还不是该功能的重点。回到.NET的起始,JIT支持默认编译模式和用于调试的无优化编译模式。正常模式产生更好的代码质量并且编译需要更长时间,而“无优化”模式则相反。对于分层编译,我们创建了新的配置名称“Tier0”和“Tier1”,但这些配置生成的代码与我们一直使用的“无优化”和“正常”模式大致相同。到目前为止,大多数JIT更改都涉及在请求“Tier0”代码时使JIT生成代码更快。我们希望将来继续提高Tier0编译速度,

  • CodeVersionManager(代码版本管理)跟踪同一方法的不同代码编译(版本) - 最基本的是一个大内存字典,它存储应用程序中.NET方法之间的映射和不同程序集实现的列表运行时可以使用它来执行该方法。我们使用一些技巧来优化这种数据结构,但如果你想深入研究项目的这个方面,可以参考我们提供的非常好的规范。

  • 相同方法的不同汇编代码汇编之间,在运行时状态下热更新的机制, - 当方法A调用方法B时,调用将依赖于jmp指令。通过调整运行时的jmp指令可以控制执行B的哪个实现。

  • 决定要创建哪些代码版本以及何时在它们之间切换的策略 - 运行时始终首先创建Tier0,这是从ReadyToRun映像加载的代码,或者是使用最小化优化的代码。呼叫计数器用于确定频繁运行哪些方法,并使用计时器来避免在启动期间过早创建Tier1的工作。一旦计数器和计时器都满足,该方法就会排队,后台线程会编译Tier1版本。有关详细信息,请查看规范。

我们从哪里开始?

分层编译创造了各种可能性,我们可以继续充分利用未来的时间。既然运行时可以利用更极端的情况,那我们就有了扩展边界的动力和动力,既可以加快编译速度,又可以生成更高质量的代码。通过代码的运行时热更新,.NET可以进行更详细的分析,然后使用运行时反馈来进行更好的优化(配置文件引导优化)。这些技术可以允许代码生成器甚至超出无法访问配置文件数据的最佳静态优化器。或者还有其他选项,例如用于更好诊断的动态去优化,用于减少内存使用的可收集代码,以及用于性能检测或服务的热补丁。目前,我们最直接的目标仍然接近实际 - 确保预览中的功能运行良好,响应您的反馈,并完成工作的第一次迭代。

总结

我们希望Tiered Compilation为您的应用程序提供与我们的基准测试相同的重大改进,并且我们知道还有更多尚未开发的潜力。请试一试,然后访问github,向我们提供反馈,讨论,提问,甚至可以贡献一些自己的代码。谢谢!

原文:.NET Core 2.1中的分层编译(预览)

原文地址:https://www.cnblogs.com/xiaoliangge/p/9441988.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces 刷题记录(已停更)

Codeforces 每日刷题记录 (已停更) 打‘’是一些有启发意义的题目&#xff0c;部分附上一句话题解&#xff0c;每日更新3题&#xff0c;大部分题目较水。 DayIDProblemTutorialNote11CF1073E状压&#xff0c;数位dp&#xff0c;官方题解std骚操作\(~\)2CF1072A\(~\)3CF1072B24C…

牛客练习赛60 ~ 斩杀线计算大师

题目传送 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K Special Judge, 64bit IO Format: %lld 题目描述 算术能力是每个炉石玩家必不可少的&#xff0c;假设现在有三种伤害卡&#xff0c;伤害值分别是a,b…

【贪心】Stall Reservations(luogu 2859/poj 3190)

Stall Reservations luogu 2859 poj 3190 题目大意&#xff1a; 有n头牛&#xff0c;每头牛都有自己的挤奶时间&#xff0c;挤奶时间内每头牛用一个奶棚&#xff0c;现在问最少需要多少个奶棚 输入样例 5 1 10 2 4 3 6 5 8 4 7输出样例 4 1 2 3 2 4数据范围 1⩽N⩽50,00…

选择IT事业,意味着终身学习

八月&#xff0c;炎阳如火。 前几天书记找我交流&#xff0c;问我离职的原因&#xff0c;我跟他仔细的分析了一下我的职业发展规划和我对于未来的预期&#xff0c;书记也向我分析了一下他所认为的原因&#xff0c;他说&#xff0c;无外乎是三个原因&#xff1a;第一个是钱的问…

P4103-[HEOI2014]大工程【虚树,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4103 题目大意 nnn个点的一棵树&#xff0c;mmm次给出一些点&#xff0c;求最近点对&#xff0c;最远点对和所有点对的距离和。 解题思路 先构造一棵虚树&#xff0c;然后在上面dpdpdp统计答案即可。 codecodecode #includ…

牛客网【每日一题】Shortest Path 4月3日题目精讲 DFS

题号 NC13886 Shortest Path 西南交通大学第十三届ACM决赛 题意&#xff1a; 一棵偶数节点的树&#xff0c;分成n/2对&#xff0c;两两一组&#xff0c;所有组的路径之和最小是多少&#xff1f; 题解&#xff1a; 如果两个点之间相连将另外两个相连的点覆盖&#xff0c;那么完全…

是男人就过 8 题--Pony.AI 题 - A String Game

是男人就过 8 题--Pony.AI 题 - A String Game 题目来源 题意&#xff1a;给一个串t以及n个t的子串s&#xff0c;两个人每轮可以选择一个s在他的后边添加一个字符满足得到的新串仍是t的子串&#xff0c;第一个不能操作的人输。 做法&#xff1a;对s串建SAM&#xff0c;在一个子…

使用Jexus服务器运行Asp.Net Core2.0程序

前段时间写了篇关于.net core跨平台部署的文章。https://my.oschina.net/lichaoqiang/blog/1861977主要讲述了&#xff0c;利用NginxCentOSSupervisor.NetCore2.1&#xff0c;来运行.net core程序&#xff0c;感兴趣的朋友可以看一下。今天向大家介绍.net core使用jexus服务器的…

【结论】棋盘(jzoj 2297)

棋盘 jzoj 2297 题目大意&#xff1a; 在棋盘上有一个特殊的象&#xff0c;他可以向四个方向行走若干步&#xff08;左上&#xff0c;左下&#xff0c;右上&#xff0c;右下&#xff09;&#xff0c;现在问从某一个点是否能到另外一个点 输入样例 5 1 1 2 2 2 3 2 2 1 2 4…

P3233-[HNOI2014]世界树【虚树,倍增】

正题 题目链接:https://www.luogu.com.cn/problem/P3233 题目大意 nnn个点的一棵树&#xff0c;mmm次选出一些点作为关键点。每个树上的点会对最近的关键点做贡献&#xff0c;求每个关键点的贡献。 解题思路 显然是虚树&#xff0c;考虑如何在虚树上求贡献&#xff0c;我们发…

牛客每日一题3.31 城市网络 树上倍增

牛客网 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 有一个树状的城市网络&#xff08;即 n 个城市由 n-1 条道路连接的连通图&#xff09;&#xff0c;首都为 1 号城市&…

RRRR_wys' Blog 3.0 准备上线啦!

RRRR_wys Blog 3.0 准备上线啦&#xff01; 今年马上要过完啦&#xff0c;打算在年前把博客翻翻新之前的布局太复杂了&#xff0c;感觉很视觉疲劳&#xff0c;这一版我打算能删就删完善了\(markdown\)还有一些地方要修&#xff0c;放假再说辣在vj上交了道cf&#xff0c;有惊喜 …

【ST表】栈(jzoj 2295)

栈 jzoj 2295 题目大意&#xff1a; 有一个A数组&#xff0c;一个B数组和一个栈&#xff0c;现在把A数组的数存入栈&#xff08;操作1&#xff09;&#xff0c;然后再从栈中取出来放在B数组&#xff0c;但取出可以从栈顶&#xff08;操作2&#xff09;&#xff0c;也可以从栈…

CSPNOIP2020总结

这里是目录友链CSPpartCSP\ \ partCSP partCSP−S1CSP-S1CSP−S1CSP−S2CSP-S2CSP−S2游记PartPartPart后面PartPartPart总结PartPartPartNOIPpartNOIP\ \ partNOIP partDay0Day\ \ 0Day 0Day1Day\ 1Day 1友链 stoorz的CSPNOIP游记是这个逼强行拉我加友链\tiny\color{white…

WebApiClient的JsonPatch局部更新

1. 文章目的随着WebApiClient的不断完善&#xff0c;越来越多开发者选择WebApiClient替换原生的HttpClient&#xff0c;本文将介绍使用WebApiClient来完成JsonPatch提交的新特性。2. json patch介绍在服务端WebApi开发的时候&#xff0c;如果设计一个更新登录用户的个人信息的接…

SPOJ1812 LCS2

SPOJ1812 LCS2 题意&#xff1a;给n个串&#xff0c;求最长公共子串 做法&#xff1a;对第一个串建\(SAM\)&#xff0c;拿剩余的串类似于求\(LCS\)的在上面跑&#xff0c;对于当前这个串&#xff0c;求出可以到达每个状态的最长子串长度&#xff0c;然后&#xff0c;每个状态对…

【每日一题】4月1日题目 Rinne Loves Edges

牛客网 链接&#xff1a;https://ac.nowcoder.com/acm/problem/22598 来源&#xff1a;牛客网 题目&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format:%lld 题目描述 Rinne 最近…

【bfs】神殿(jzoj 2296)

神殿 jzoj 2296 题目大意&#xff1a; 用一个n∗mn*mn∗m的矩阵&#xff0c;每个单位都是一个1∗11*11∗1的房间&#xff0c;房间的四个方向只有某些方向有门&#xff08;说明如下图&#xff09;&#xff0c;要从一个房间走向相邻的房间&#xff08;算一个单位时间&#xff…

P7077-函数调用【拓扑排序,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P7077 题目大意 有一些函数分为三种 让一个位置的数加上一个数让所有数乘上一个数按顺序执行一些函数 然后不会有环&#xff0c;按顺序调用一些函数&#xff0c;求最后每个位置的数。 解题思路 我们发现对于一个乘操作其实…

如何在本地数据中心安装Service Fabric for Windows集群

概述首先本文只是对官方文档&#xff08;中文&#xff0c;英文&#xff09;的一个提炼&#xff0c;详细的安装说明还请仔细阅读官方文档。虽然Service Fabric的官方名称往往被加上Azure&#xff0c;但是实际上&#xff08;估计很多人不知道&#xff09;Service Fabric可以安装到…