当前位置: 首页 > news >正文

性能是.NET Core的一个关键特性

\

关键要点

\\
  • .NET Core是跨平台的,可运行在Windows、Linux、Mac OS X和更多平台上;与.NET相比,发布周期要短得多。大多数.NET Core 都是通过NuGet软件包交付的,可以很容易地发布和升级。\
  • 更快速的发布周期对性能提升工作以及改进诸如SortedSet和LINQ . tolist()方法等语言结构性能的大量工作都有着特别的帮助。\
  • 通过引入了System.ValueTuple和Span这样的类型,更快的周期和更容易的升级也为迭代改进 .NET Core性能的新想法带来了机会。\
  • 这些改进之后可以反馈到完整的 .NET 框架中。\
\\

随着.NET Core2.0的发布,微软有了下一个主要版本的通用目标,模块化、跨平台和开源平台最初发布于2016年。.NET Core 已经创建了许多api,这些api可以在.NET 框架的当前版本中使用。它最初是为下一代ASP.NET创建的解决方案,但现在是驱动、是许多其他场景的基础,包括物联网、云和下一代移动解决方案。在本系列中,我们将探讨一些.NET Core的好处,以及它如何不仅能让传统的.NET开发人员受益,还能让所有需要为市场带来健壮、高性能和经济解决方案的技术人员受益。

\\

这篇InfoQ文章是该系列文章\".NET Core\"的一部分。您可以订阅每周精要接收通知。

\\

现在,.NET Core正在路上,微软和开源社区可以在框架的新特性和增强上进行更快速的迭代。在.NET Core中,性能是持续关注的一个领域: .NET Core在执行速度和内存分配方面都带来了许多优化。

\\

在这篇文章中,我们将讨论一些优化,以及如何在以后的性能工作中更多地使用连续流或Span\u0026lt;T\u0026gt;,为我们的开发人员生活带来帮助。

\\

.NET 和.NET Core

\\

在深入研究之前,让我们先看看完整的.NET框架(为方便起见我们称之为.NET)和.NET Core之间的主要区别。为了简化问题,让我们假设两个框架都遵循.NET标准,它本质上是一个规范,定义了所有.NET的基类库基线。这使得两个世界非常相似,除了两个主要的区别:

\\

首先,.NET主要是在Windows上的,而.NET Core是跨平台的,可运行在Windows、Linux、Mac OS X和更多平台上。第二,发布周期非常不同。.NET作为一个完整的框架安装程序,它是系统范围的,通常是Windows安装的一部分,使发布周期更长。对于.NET Core,在一个系统上可以有多个.NET Core安装,而且没有长时间的发布周期:大多数.NET Core是以NuGet包交付的,可以轻松地发布和升级。

\\

最大的优点是.NET Core世界可以更快地迭代并文学地尝试新概念,并最终将它们反馈到完整的.NET框架中,作为未来.NET标准的一部分。

\\

经常(但不总是),.NET Core的新特性是由c#语言设计驱动的。因为框架可以更快地进化,语言也可以。一个快速发布周期和性能增强的主要例子是System.ValueTuple。c#和VB.NET 15引入了“值元组”,这很容易添加到.NET Core,因为更快的发布周期,并且针对完整的.NET 4.5.2和更早的版本,可以作为一个NuGet包用于完整的.NET,在.NET 4.7中也可以仅成为完整的.NET框架的一部分。

\\

现在让我们来看看其中的一些性能和内存改进。

\\

.NET Core的性能改进

\\

.NET Core工作的优点之一是,许多东西要么需要重新构建,要么需要从完整的.NET框架中移植。让所有的内部构件在flux中运行一段时间,再加上快速发布周期,提供了一个在代码中进行一些性能改进的机会,以前,这些性能改进几乎被认为是“不要碰,它刚刚正常工作!“。

\\

让我们从SortedSet和它的Min和Max的实现开始。SortedSet是通过利用自平衡树结构,以有序顺序维护的对象集合。在此之前,从该集合中获取最小或最大对象需要向下遍历树(或向上),调用每个元素的委托,并将返回值设置为当前元素的最小值或最大值,最终到达树的顶部或底部。调用该委托并传递对象意味着有相当多的开销。直到有一个开发人员看到了这棵树,并删除了不需要的委托调用,因为它没有提供任何值。他自己的基准测试显示有30%-50%的性能提升。

\\

另一个很好的例子是在LINQ中,在常用的. tolist()方法中更具体。大多数LINQ方法在IEnumerable上作为扩展方法操作,以提供查询、排序和诸如. tolist()之类的方法。通过这样做,我们不必关心底层IEnumerable的实现,只要 能够遍历它就行了。

\\

缺点是,当调用. tolist()时,我们不知道要创建的列表的大小,只枚举enumerable中的所有对象,这把即将返回的列表的大小增加了一倍。这有点愚蠢,因为它潜在地浪费了内存(和CPU周期)。因此,如果底层IEnumerable实际上是具有已知大小的列表或数组,那么就会更改为创建一个已知大小的列表或数组。来自.NET团队的基准测试显示,这些数据的吞吐量增加了4倍。

\\

当查看GitHub上CoreFX实验室存储库中的pull请求时,我们可以看到微软和社区都做出了大量的性能改进。因为.NET Core是开源的,你也可以提供性能修正。其中大多数都是:对.NET中的现有类进行修复。但还有更多:.NET Core还介绍了一些关于性能和内存的新概念,这些概念不仅仅是修复这些现有的类。让我们来看看本文其余部分的内容。

\\

减少使用System.ValueTuple的分配

\\

假设我们想从一个方法返回多个值。以前,我们要么使用out参数,这让人用起来非常不爽,而且在编写async方法时也不支持。另一种选择是使用System.Tuple作为返回类型,但它分配了一个对象,并且具有相当不友好的属性名称(Item1, Item2,…)。第三种选择是使用特定类型或匿名类型,但是在编写代码时这种做法会引入开销,因为我们需要定义类型,而且如果我们需要的是嵌入在该对象中的值,它也会造成不必要的内存分配。

\\

遇到元组返回类型,由System.ValueTuple支持。c# 7和VB.NET 15添加了一个语言特性,可以从一个方法返回多个值。下面是之前和之后的示例:

\\
\//之前:\private Tuple\u0026lt;string, int\u0026gt; GetNameAndAge()\{\  return new Tuple\u0026lt;string, int\u0026gt;(\"Maarten\

相关文章:

  • itext7 html转pdf实现
  • django常见问题
  • mysql 查询表的字段数目
  • docker run 与docker start的区别
  • qsort用法
  • Python3学习笔记-构造函数与析构函数
  • SQL Server查询优化方法(查询速度慢的原因很多,常见如下几种)
  • Java入门 | 如何傻瓜式的安装JDK和配置环境变量?
  • git 比较 change to be committed
  • MySQL DDL--ghost工具学习
  • Vue父子组件传值 | 父传子 | 子传父
  • 【转】奇异值分解(SVD)原理详解及推导
  • MaxCompute studio FAQ
  • dubbo-admin2.8.4部署
  • 时间选择控件YearPicker(基于React,antd)
  • [译]CSS 居中(Center)方法大合集
  • create-react-app做的留言板
  • Java多态
  • jquery ajax学习笔记
  • Laravel 中的一个后期静态绑定
  • Mithril.js 入门介绍
  • orm2 中文文档 3.1 模型属性
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 构建工具 - 收藏集 - 掘金
  • 简单基于spring的redis配置(单机和集群模式)
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 设计模式 开闭原则
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 终端用户监控:真实用户监控还是模拟监控?
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 交换综合实验一
  • 数据可视化之下发图实践
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​马来语翻译中文去哪比较好?
  • #HarmonyOS:Web组件的使用
  • ${ }的特别功能
  • %check_box% in rails :coditions={:has_many , :through}
  • (2020)Java后端开发----(面试题和笔试题)
  • (4.10~4.16)
  • (第61天)多租户架构(CDB/PDB)
  • (二)斐波那契Fabonacci函数
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (十)T检验-第一部分
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)kafka实战——kafka源码编译启动
  • .gitignore文件设置了忽略但不生效
  • .net core 6 redis操作类
  • .NET Core跨平台微服务学习资源
  • .NET 设计模式初探
  • .Net6 Api Swagger配置
  • .net操作Excel出错解决