据微软工程师Mukul Sabharwal介绍,在将微软搜索引擎必应迁移到.NET Core 2.1之后,内部服务延迟降低了34%,这主要归功于.NET社区贡献的改进。
按照Sabharwal的说法,.NET Core的多项改进贡献了大部分的性能提升,包括字符串相等矢量化、使用新的Span<T>
类型的string.IndexOf/LastIndexOf,它们加速了HTML渲染和操作;EqualityComparer.Default去虚拟化,这提升了字典性能;并发GC写监视,这降低了CPU使用;还有其他的特性。
(图片来自微软博客)
如上所述,大部分改进都是由.NET社区贡献的,Sabharwal指出,虽然许多GitHub pull request来自微软员工。据Sabharwal介绍,有两个关键因素使得必应可以迁移到.NET Core 2.1。一个是支持ReadyToRun镜像,这使得JIT编译变成了一个预部署步骤。没有ReadyToRun镜像,所有代码在它要在上面运行的每一台机器上都应该JIT编译,由于支撑必应的机器数量众多,所以这会显著降低服务能力。使用.NET Core的crossgen工具,就可以在微软实验室中对应用程序进行预编译,然后部署镜像。第二个关键因素是.NET Standard 2.0,一个超过32K API的集合,这可以帮助开发人员确保他们的代码可以在多个平台上轻松地移植到.NET Core 2.1。
最后,Sabharwal强调了使用xcopy从他们的持续集成管道部署必应应用程序中的.NET Core运行时的重要性。这才使得必应在.NET Core 2.1正式发布仅两天之后就过渡到了.NET Core 2.1。
正如InfoQ在.NET Core 2.1发布时所报道的那样,.NET Core 2.1其中一个最大的卖点就是性能提升,以及采用自包含部署形式的新部署选项。在性能方面,最引人注意的是,.NET Core 2.1带来了对新类型System.Span<T>
的支持,该特性稍后也添加到了F# 4.5中。此外,JIT编译器有许多优化,包括上面列出的这些。想要深入了解更多有关.NET Core 2.1性能改进的信息,请查阅微软工程师Stephen Toub的博客。
原文地址: http://www.infoq.com/cn/news/2018/08/bing-speedup-dotnet-core-2.1
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com