.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跨平台或扫描二维码关注

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

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

相关文章

JSP 统计网站访问人数

统计访问人数1 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><base href"<%basePath%>…

阿里巴巴宣布开源限流降级中间件——Sentinel

转载自 阿里巴巴宣布开源限流降级中间件——Sentinel 近日&#xff0c;阿里巴巴中间件团队宣布开源 Sentinel&#xff0c;并发布了首个社区版本v0.1.0。GitHub地址为&#xff1a;https://github.com/alibaba/Sentinel 。 关于Sentinel&#xff0c;阿里巴巴给出的描述比较简单…

张君豪同学谈学习

开学也快一个月了&#xff0c;也渐渐适应了学校生活&#xff0c;与同学一起非常的开心&#xff0c;老师讲的课也听得更认真了&#xff0c;回想一下&#xff0c;过去的几周&#xff0c;还是有不少的感想啊&#xff0c;于是我就粗略的总结一下。因为某些原因&#xff0c;导致晚开…

== 和 equals() 区别

一、回顾 的使用&#xff1a;&#xff1a;运算符 1. 可以使用在基本数据类型变量和引用数据类型变量中 2. 如果比较的是基本数据类型变量&#xff1a;比较两个变量保存的数据是否相等。&#xff08;不一定类型要相同&#xff09;如果比较的是引用数据类型变量&#xff1a;比较…

.NET Core 2.0 Preview2 发布汇总

前言 关于 ASP.NET Core 2.0 的新功能可以查看 Amazing ASP.NET Core 2.0。 这篇文章是 Priview2中的一些改进。 .NET Core 2.0 - Preview2 Azure 的改进Docker 镜像转移到了 Debian Stretch修复并支持 macOS High Sierra质量和性能的改进dotnet restore 将在 dotnet run,pu…

再有人问你volatile是什么,就把这篇文章发给他

转载自 再有人问你volatile是什么&#xff0c;就把这篇文章发给他 在再有人问你Java内存模型是什么&#xff0c;就把这篇文章发给他中我们曾经介绍过&#xff0c;Java语言为了解决并发编程中存在的原子性、可见性和有序性问题&#xff0c;提供了一系列和并发处理相关的关键字…

端午前夕的班级小游戏

文章原创&#xff1a;高启航同学文章编辑&#xff1a;穆雄雄今天2020年6月24号&#xff0c;端午节放假前夕一早&#xff0c;依旧照常的早自习&#xff0c;同学们抵抗着困倦都在尽力而为的阅读笔记&#xff0c;虽然有些小不情愿&#xff0c;但声音还是很大。今天是班主任以及班委…

Servlet 流程控制

在之前的登陆例子里面所有的代码都是放到了jsp的页面中&#xff0c;但是JSP是负责显示的&#xff0c;现在用于了流程控制&#xff0c;这样十分不妥&#xff0c;所以我们把代码提取到了servlet里面 代码实现 Login.jsp <h3>用户登录</h3> <form action"…

TCP 三次握手原理,你真的理解吗

转载自 TCP 三次握手原理&#xff0c;你真的理解吗 最近&#xff0c;阿里中间件小哥哥蛰剑碰到一个问题——client端连接服务器总是抛异常。在反复定位分析、并查阅各种资料文章搞懂后&#xff0c;他发现没有文章把这两个队列以及怎么观察他们的指标说清楚。 因此&#xff0…

属于你们的“礼仪小课堂”

2020年7月2日&#xff0c;对于3班的孩子们来说&#xff0c;是个无比重要的日子。在于老师&#xff08;6班班主任&#xff09;和王老师&#xff08;3班班主任&#xff09;紧锣密鼓的准备下&#xff0c;终于在我们班内开展了以“礼仪”为主题的专题讲解&#xff0c;此次讲解的主角…

.Net程序调试与追踪的一些方法

前言 作为一个.net开发工程师&#xff0c;不管是在写桌面程序、服务程序或web程序&#xff0c;在开发阶段&#xff0c;我们必须非常熟悉vs的动态调试技能&#xff0c;当然web程序可能还需要调试前端的脚本或样式&#xff0c;这不在本文的讨论范围。本文主要介绍vs的动态调试基…

toString()

Object类中toString()的使用&#xff1a; 1. 当我们输出一个对象的引用时&#xff0c;实际上就是调用当前对象的toString() 2. Object类中toString()的定义&#xff1a;public String toString() {return getClass().getName() "" Integer.toHexString(hashCode())…

线上服务器内存分析及问题排查

转载自 线上服务器内存分析及问题排查 平常的工作中&#xff0c;在衡量服务器的性能时&#xff0c;经常会涉及到几个指标&#xff0c;load、cpu、mem、qps、rt等。每个指标都有其独特的意义&#xff0c;很多时候在线上出现问题时&#xff0c;往往会伴随着某些指标的异常。大部…

RabbitMQ系列教程之一:我们从最简单的事情开始!Hello World

一、简介 RabbitMQ是一个消息的代理器&#xff0c;用于接收和发送消息&#xff0c;你可以这样想&#xff0c;他就是一个邮局&#xff0c;当您把需要寄送的邮件投递到邮筒之时&#xff0c;你可以确定的是邮递员先生肯定会把邮件发送到需要接收邮件的人的手里&#xff0c;不…

红歌合唱之团结就是力量

今天&#xff0c;由王老师组织的班级红歌大合唱之“团结就是力量”圆满落幕&#xff01;下面是整个合唱的视频&#xff0c;同学们个个都朝气蓬勃&#xff1a;以下是《团结就是力量》的全部歌词团结就是力量团结就是力量这力量是铁这力量是钢比铁还硬比钢还强向着法西斯蒂开火让…

Servlet API

1、书写一个servlet的方式 Servlet必须直接或间接实现 javax.servlet.Servlet 接口 通过继承javax.servlet.GenericServlet 类实现跨协议的 Servlet 通过继承javax.servlet.HttpServlet实现HTTP Servlet 自己定义个servlet&#xff0c;然后其他的java类都继承自己写好的servlet…

EventBus In eShop -- 解析微软微服务架构eShopOnContainers(四)

引言 大家好像对分析源码厌倦了&#xff0c;说实在我也会厌倦&#xff0c;不过不看是无法分析其后面的东西&#xff0c;从易到难是一个必要的过程。 今天说下EventBus&#xff0c;前几天园里的大神已经把其解刨事件总线&#xff08;Event Bus&#xff09;知多少&#xff0c;我…

基本数据类型、包装类、String三者之间的相互转换

package com.wdl.day13;import org.junit.Test;/** 包装类的使用:* 1.java提供了8种基本数据类型对应的包装类&#xff0c;使得基本数据类型的变量具有类的特征** 2.掌握的&#xff1a;基本数据类型、包装类、String三者之间的相互转换****/ public class WrapperTest {//Strin…

很简单很简单的DBHelper类

记录一个简单的DBHelper类吧&#xff0c;用的时候在上来拿&#xff01; /// <summary>/// 数据库连接工具类/// </summary>public class DBHelper{string constr "Data Source.;Initial CatalogschoolDB;Integrated SecurityTrue";private SqlConnecti…

DDD理论学习系列(1)-- 通用语言

1.引言 在开始之前&#xff0c;我想我们有必要先了解以下DDD的主要参与者。因为毕竟语言是人说的吗&#xff0c;就像我们面向对象编程一样&#xff0c;那通用语言面向的是&#xff1f;DDD的主要参与者&#xff1a;领域专家开发人员领域专家&#xff1a;精通业务的任何人。开发…