AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

.NET Core 运行时和基础类库性能提升

  • 2017-06-27
  • 本文字数:1603 字

    阅读完需:约 5 分钟

微软宣布改进了.NET Core 运行时和基础类库的性能。虽然没有像改进ASP.NET Core 的性能那样大肆宣传,但这些改进同样重要。

其中,以下10 个方面的变化比较显著:集合、LINQ、压缩、加密、数学运算、序列化、文本处理、文件I/O、网络和并发。至于任何一组性能变化如何影响具体的应用程序则取决于具体的使用模式。下面的讨论只列出了一些要点,让你对这些改进有一个大概的了解。其中有许多变化是基于开源Pull Request 请求。这样,一些对于微软而言因为总体影响极小而不值得实现的重要修改就可以实现了。而这些修改对于很大一部分开发人员而言相当重要。

集合几乎在任何应用程序中都有广泛的应用。许多操作都通过简化集合或降低复杂度得到了改进。其中有些改进得益于减少开销,如简化操作实现更好的内联,或者减少指令数量。SortedSet 的构造函数得到了修复,因为最初该构造函数采用了一种简单的方式编写,在处理重复时可扩展性不是很好。SortedSet 的Min 和 Max 不需要遍历整棵树。List.Add 的速度更快了。不只是System.Collections.Generic 得到了改进,其他命名空间如System.Collections.Concurrent 也得到了改进。 ConcurrentQueue 和ConcurrentBag 基本上重写了。LINQ 用户应用仅从集合的改进就可以感受到性能的提升了。

此外,LINQ 本身的性能也是一个改进方面。为了减少内存分配的数量和大小以及简化算法,.NET Core 的许多操作符都重写了。例如,Enumerable.Concat 可以确保串联多个Enumerable 时线性增长,而不是指数增长。ToList 和Select 操作符经过了简化,减少了内存分配和委托及接口的使用,同时将字段读写最小化,避免了复制。Enumerable.ToArray 现在对内部缓冲区的管理也更好了。

与集合和LINQ 操作内存不同,压缩通常是受CPU 限制。例如,DeflateStream 现在使用了一个原生解压库。该原生解压库也经过了优化。

在加密方面,SHA256.Create 使用了一种原生实现,如Windows 上的CNG,或Unix 上的OpenSSL。

数学运算操作在操作BigInteger 时的性能得到了提升。

二进制序列化是CPU、数据和内存密集型的。.NET Core 2.0 增加了BinaryFormatter,并允许O(N) 算法在切换到O(N2) 算法之前使用更长的时间。现在,较大的序列化输入可以更快地处理了。

对于文本处理,Regex.IsMatch 在内存分配方面更高效了,而且,由于数据缓存方式的变化,垃圾收集也更高效了。WebUtility.UrlDecode 不再对输入做实际上并不需要的解码了。微软针对一些内置的Encoding 派生类型进行了循环优化。

微软对字符串操作也做了许多改进。Enum.Parse 在内存使用方面更高效了,所以垃圾收集也更高效了。各种ToString 方法也经过了改进。String 类本身的方法也经过了改进,如IndexOf 和StartsWith。考虑到字符串在应用程序中使用比较多,这样的改进应该会产生巨大的影响。

文件I/O 经过了改进。使用异步读写的FileStreams 现在效率更高了。

底层网络协议栈经过了改进。异步套接字现在允许此类操作实际上同步完成,从而避免异步完成的开销。这些类型的变化对于使用套接字原语的上层函数有很大的影响。与上层网络类如NetworkStream 和 SslStream 相关的工作也是一个改进的来源。

对并发与并行的修改工作已经开展。许多.NET 应用程序使用ThreadPool 类。例如,QueueUserWorkItem 使用一个同步控制和内存分配更少的队列取代了全局队列,大大减少了垃圾收集工作。对于类似SpinLock 这样的同步原语,相关的改进工作一直在进行。SpinLock.TryEnter 经过了改进,当无法立即获得锁时,它会更快地失败。对于使用这个类的热门执行路径,这项改进带来了巨大的性能提升。

在这一轮的性能改进工作中,有大约1000 个Pull Request 被合并进来,而需要完成的工作还有许多。总之,在增加基于性能的API 及改进现有库方面,性能提升有更高的优先级。

BenchmarkDotNet 对这些修改做了一些独立的测试

查看英文原文.NET Core Runtime and Base Class Library Performance

2017-06-27 19:002635
用户头像

发布了 1008 篇内容, 共 410.4 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

哪里有便宜的云服务器?可以下月付款吗?

行云管家

云计算 服务器 云服务器

JscriptScript的类型

渔戈

JavaScript 前端 10月月更

云网融合赋能智慧转型,“天翼云管 ”开启贴身云管家时代

天翼云开发者社区

更易用的OceanBase|生态工具征文大赛正式开启!

OceanBase 数据库

华为云数据库GaussDB(for MySQL),为企业云上业务发展保驾护航

爱尚科技

项目实战:在线报价采购系统(React +SpreadJS+Echarts)

葡萄城技术团队

React 项目实战 采购软件 echart

2022年中国篮球内容消费趋势洞察

易观分析

消费 篮球

现代农业|AIRIOT智慧农业管理解决方案

AIRIOT

低代码 物联网 智慧农业

凭什么 31x31 大小卷积核的耗时可以和 9x9 卷积差不多?| 文末附 meetup 回顾

MegEngineBot

深度学习 开源 卷积 MegEngine

场景金融持续引发行业关注,4.0时代打造金融服务新生态

易观分析

银行 场景金融

【限量招募30人】免费参与SPSS云版本内测

淋雨

SPSS

开启自然资源管理“智绘”之路!

天翼云开发者社区

智慧城市、数字政府、城市大脑、一网统管之间有什么关系

雨果

智慧城市 城市大脑 数字政府 一网统管

系统服务熔断、限流:常见限流算法&主流熔断技术详解

程序员小毕

Java 程序员 分布式 微服务 SpringCloud

基于Delta Lake构建数据湖仓体系

阿里云大数据AI技术

大数据 开源 企业号十月 PK 榜

数聚生态,智驭全界!看天翼云如何为智慧园区注入新动能!

天翼云开发者社区

基于 MinIO 部署单实例 Databend | 新手篇(1)

Databend

天翼云国产化全栈云服务赋能数字中国建设

天翼云开发者社区

华为云数据库-GaussDB for MySQL数据库

爱尚科技

永久免费低代码开发平台有哪些?

优秀

低代码 低代码开发平台

浅谈Mixin、Composition API、Reactive API、Ref API以及readonly🔥

渔戈

前端 Vue3 10月月更

千锋1024程序员节大咖讲师技术直播火力全开

千锋IT教育

SAP | 消息 MESSAGE

暮春零贰

SAP 消息 10月月更

天翼云推出全栈政务混合云支持私有化运行

天翼云开发者社区

落地DataOps,必须克服的挑战有哪些?

雨果

DataOps

京东云开发者|探寻软件架构的本质,到底什么是架构?

京东科技开发者

架构 软件架构 软件架构师

高可用系统哪家靠谱?工作原理是什么?

行云管家

高可用 高可用架构 高可用集群

MetaForce佛萨奇魔豹2.0系统开发技术讲解方案

I8O28578624

快被Gartner捧上天的Data Fabric数据经纬到底是个啥?

雨果

Data Fabric 数据经纬

JavaScript的类型转换

渔戈

JavaScript 前端 10月月更

深入理解什么是TCP 粘包?粘包警察是什么梗?

C++后台开发

网络协议 TCP/IP 后端开发 C++开发 TCP 粘包

.NET Core运行时和基础类库性能提升_.NET_Michael Stiefel_InfoQ精选文章