写点什么

.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:002735
用户头像

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

关注

评论

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

元宇宙会议来了,3DCAT助力2022长宁区科技创新主题论坛开展

3DCAT实时渲染

云计算 元宇宙 实时渲染 实时云渲染 云VR

Wordpress 如何添加 Ads.txt 文件

HoneyMoose

如何进行高效的文档管理?这三点很重要!

Baklib

文档管理 企业文档管理工具

ESP32-C3 VScode开发环境搭建(基于ESP-IDF—Windows和Ubuntu双环境)

矜辰所致

vscode 开发环境 ESP32-C3 9月月更

9月大厂Java岗面试原题复盘,双非2年经验成功内推进入阿里!

收到请回复

Java 云计算 开源 架构 编程语言

【数据结构】带头+双向+循环链表(增、删、查、改)的实现_【附源码、图片示例】_ [初阶篇_ 复习专用]

Dream-Y.ocean

c 双向循环链表 9月月更

一款开源的基于 Angular 的电商 Storefront 开发框架介绍

汪子熙

typescript 前端开发 angular 电商 9月月更

DCAT亮相WAIC 2022浦东分会场——元宇宙博览会暨数字光影大会

3DCAT实时渲染

云计算 元宇宙 实时渲染 实时云渲染 云VR

易周金融分析 | 易观千帆发布7月城商行农商行APP盘点;养老理财产品跨行代销布局提速

易观分析

金融 理财产品

中山市等级测评机构有哪些单位?电话号码是多少?

行云管家

等保测评 等级测评 中山市

千行百业,可信开源,2022 OSCAR开源产业大会成功召开

Ada@SegmentFault

为什么Kubernetes和容器与机器学习密不可分?

京东科技开发者

人工智能 机器学习 Kubernetes 容器 ML

「番外篇」如何用Git平台账号登录建木CI with docker-compose.yml

Jianmu

DevOps 低代码 CI/CD gitops 无代码

建木持续集成平台v2.5.5发布

Jianmu

开源 DevOps 低代码 CI/CD 无代码

什么是帮助中心?企业该怎样制作帮助中心页面?

Baklib

企业 帮助中心

瑞云科技总经理邹琼出席2022世界人工智能大会投融资主题论坛

3DCAT实时渲染

云计算 元宇宙 实时渲染 实时云渲染 云VR

速度与安全可兼得!改造异步布局大幅提升客户端布局性能

小红书技术REDtech

性能优化 安卓 客户端 Andriod

啃完这32W字的Java程序员面试题,大厂面试分分钟搞定!

收到请回复

Java 云计算 开源 架构 编程语言

面试复盘 | 2022届 大疆秋招 测试开发 完整面经

Java-fenn

Java

OSCAR开源产业大会|中国信通院可信开源评估最新结果正式发布

Ada@SegmentFault

Spring 注册 Bean 在配置中的定义和使用 Autowired

HoneyMoose

「Gitea篇」如何用Git平台账号登录建木CI

Jianmu

DevOps 持续集成 gitops 建木

云管平台的优势有哪些?哪家云管平台好?

行云管家

云计算 云管平台 云管理

海龟绘图简单科普

吉师职业混子

9月月更

抢抓国际标准 中国“原创”企业成国际事务处理性能委员会(TPC)新成员

科技热闻

Maven 中依赖使用的版本号

HoneyMoose

有关Redis你掌握好这22点,大厂面试基本稳了!

Java全栈架构师

数据库 程序员 后端 Java 面试 redis 底层原理

《OSCAR开源产业大会丨《全球开源生态研究报告(2022年)》重磅发布》

Ada@SegmentFault

面试必问的AOP,我今天用它实现了系统告警

程序员小毕

spring 源码 程序员 Java 面试 aop

字节Java大神精心编写的《Java开发者面试百宝书》,助你一臂之力!

收到请回复

Java 云计算 开源 架构 编程语言

利用Python开发App实战

千锋IT教育

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