.NET Core运行时和基础类库性能提升
微软宣布改进了.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对这些修改做了一些独立的测试。
原文地址:http://www.infoq.com/cn/news/2017/06/NETCore-Runtime-Base-Class-Perf
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
.NET Core运行时和基础类库性能提升相关推荐
- 锐龙4000系列运行matlab,修复了!AMD锐龙运行Matlab恢复正常,性能提升60%
原标题:修复了!AMD锐龙运行Matlab恢复正常,性能提升60% Matlab是美国MathWorks出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算等用途.在2020a版本中,M ...
- 快速搭建本地 .NET Core 运行时调试环境
需要的软件环境: Oracle VM VirtualBox CentOS 7 llvm lldb 3.6.0 (3.5.0我试过 dumpobj时候一直报无效参数 Invalid parameter ...
- 微软必应从.NET Core 2.1获得了性能提升
据微软工程师Mukul Sabharwal介绍,在将微软搜索引擎必应迁移到.NET Core 2.1之后,内部服务延迟降低了34%,这主要归功于.NET社区贡献的改进. \\ 按照Sabharwal的 ...
- Java内存区域(运行时数据区域)和内存模型(JMM)
原文作者:czwbig 原文:https://www.cnblogs.com/czwbig/p/11127124.html Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数 ...
- ARMS 应用安全-你的应用运行时的隐形安全卫士
随着互联网成为日常生活的基础设施,企业的应用与服务遭受安全威胁和侵害的风险不断增加.这里面的风险不仅仅是网络层面的安全问题,更有应用本身的安全.在传统网络架构下,应用位于 IDC 内,有清晰的边界,应 ...
- 小红书自研小程序:电商体验与效果优化的运行时体系设计
小程序在其诞生后的几年内,凭借其简单.轻量.流畅.无需安装等特点,引来了爆发式的增长.伴随小红书电商业务的发展,我们洞察到越来越多的商家和品牌大客户有自己定制化需求场景,传统的电商和薯店存在下面三大问 ...
- 基于 Java 2 运行时安全模型的线程协作--转
在 Java 2 之前的版本,运行时的安全模型使用非常严格受限的沙箱模型(Sandbox).读者应该熟悉,Java 不受信的 Applet 代码就是基于这个严格受限的沙箱模型来提供运行时的安全检查.沙 ...
- Azure 上使用 Windows Server Core 运行 ASP.NET Core 网站
点击上方蓝字关注"汪宇杰博客" 导语 微软智慧云 Azure 上虽然早就有 App Service 这种完全托管的 PaaS 服务可以让我们分分钟建网站.但是不自己配一下环境,就不 ...
- 运行时数据区中包含哪些区域?哪些线程共享?哪些线程独享?
运行时数据区中包含哪些区域?哪些线程共享?哪些线程独享?[⭐⭐⭐⭐⭐] Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域. JDK 1.8 和之前的版本略有不同 ...
最新文章
- 将多个文件的属性添加到数据库
- 第7篇-JAVA面向对象Ⅲ
- HashMap、Hashtable、ConcurrentHashMap的原理与区别
- 使用基本工具类和预编译进行对数据库的增删改查
- LeetCode 2065. 最大化一张图中的路径价值(DFS)
- php get 数据类型,PHP基础-数据类型-integet
- GIS基础软件及操作(五)
- pytorch下载加载mnist数据集
- 最速下降法python_python实现最速下降法
- 主流游戏引擎分析 【端游 、页游 、手游 解析】
- 龙芯3A3000搭建分布式存储服务etcd
- 微型计算机与巨型计算机相比,微型计算机的特点及应用
- A Generative Adversarial Network-based Deep Learning Method for Low-quality Defect ImageReconstructi
- 新数据库必须要做一次完全备份之后才能保留日志,在做备份之前还原模式就是简单,不管你选什么!
- 论文笔记——Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs
- 最快速的TeamTalk 服务器部署方
- 计算机二级编程题题库
- Mininet系列实验(二):Mininet可视化应用
- 浅析代理IP与VPS
- 设一个学生的信息包括学号、姓名、出生日期和性别等。把n个学生的信息放入一个集合中,可以根据学号对学生信息进行检索,并且可以根据出生日期对学生进行排序输出。