《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文

写在开始

  三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击,现在可以致敬伟大的.NET斗士甲骨文了  (JDK8以上都需要收费,Android弃用java作为第一语言,别高兴:OpenJDK是甲骨文的).

  《ASP.NET Core 高性能系列》是一套如何编写高性能Web应用技术系列文章,

我们将从.NET 2开始全面升入.其中我们会讨论互联网当今热门的技术话题:容器、容器编排、服务治理、RPC等

此文是第一篇,用于此系列的开门篇,后面每周会持续发布.

一、Core 2中需要知道的新鲜东西

Core系列有两个主要产品:

第一个是.NET Core

  它是一个低级别的提供基本库的框架。 它可以用来编写控制台应用程序,它也是

更高级别的应用程序框架的基础。 

第二个是ASP.NET Core

  它是一个用于构建Web的跨平台框架

另外.NET Core中的更改也将适用于ASP.NET Core,因为这是基础 

二、.NET Core 2的新东西

2.1 API范围更加广泛

  .NET Core 2的主要焦点是API范围的大幅增加,在1.*的基础上增加了两倍的API,

而且支持.net standard,您也可以引用.NET Framework程序集而无需重新编译,

只要程序集中的API已在.NET Core中实现就可以正常工作。这意味着更多的Nuget包可以在.NET Core中工作,

ASP.NET Core Library and Framework 支持情况的一个统计站点:https://ANCLAFS.com(有点跟不上了)

2.2 性能的大幅度提升

.NET Core 2.0中一些更有趣的变化是在原始的.NET FrameworkAPI上性能改进

,已经对许多框架的实现进行了调整了数据结构。 

下面是一些已经看到快速改进的类和方法,已经内存开销的减少包括:


List<T>

Queue<T>

SortedSet<T>

ConcurrentQueue<T>

Lazy<T>

Enumerable.Concat()

Enumerable.OrderBy()

Enumerable.ToList()

Enumerable.ToArray()

DeflateStream

SHA256

BigInteger

BinaryFormatter

Regex

WebUtility.UrlDecode()

Encoding.UTF8.GetBytes()

Enum.Parse()

DateTime.ToString()

String.IndexOf()

String.StartsWith()

FileStream

Socket

NetworkStream

SslStream

ThreadPool

SpinLock

  另外,对于.NET Core 2的RyuJIT Just In Time编译器进行了改进。

仅作为一个示例就能说明说明其优秀之处,finally块现在几乎与不使用异常一样高效,

这在没有抛出异常的正常情况下是有益的。您现在没有理由不使用try和using{}块,以及checked检查

三、ASP.NET Core 2的新东西 

  ASP.NET Core 2利用了.NET Core 2的所有改进,不仅通过即时编译处理程序缩短了启动时间,

涵盖了增加了输出缓存,本地及分布式缓存(SQLSERVER,REDIS).

3.1 metapackage

  .NET Core包含了一个新metapackage,所以你只用引用一个NuGet项就可以得到所有的东西,metapackage仍然由单个独立的包组成,

一个新的包修剪功能(new package-trimming)确保如果您不使用包,那么它的二进制文件将不会包含在您的部署中,

即使您使用metapackage 来引用它。设置Web主机配置也有合理的默认设置。

您无需单独添加logging, Kestrel, and IIS。logging也变得更简单,因为它是建立的在,你再也没有任何借口不一开始就使用它

3.2 Razor Pages

  无控制器Razor Pages。这正是它听起来的样子,而且它允许您使用Razor模板编写页面。

它类似于Web Pages产品,不必和WebForm混淆。大家其实觉得是WebForm的卷土重来,个人感觉是满怀希望的卷土重来,

架构做了更多抽象和思考,不会像之前一样,带来如此多的状态与之相伴.

3.3 新的authentication 模型

  新的 authentication 模型能让更好地使用了依赖注入, ASP.NETCore Identity 允许你使用OpenID 、OAuth 2

来为你的API获取访问tokens .当然你可以研究Identity Server 4 项目,它提供了相同的功能.

3.4 表单请求自动防伪

  你不必再为表单添加防伪token(防止跨越伪造请求) (之前你不得不添加一个attribute在Post方法中进行验证),

现在这一切都是自动的.

3.5性能提升

   ASP.NET Core有一些额外的与.NET Core无关的性能提升:

启动时间通过即时编译处理明显减少,虽然这不是ASP.NET Core 2的新功能;

 output caching依然可用,在1.0时,只有response caching*(简化了如何设置http header),

1.1 时,添加了memory cache,现在你可以还使用分布式缓存()SQL Server or Redis) 

四 .NET Standard 2.0

  .NET Standard 是一套正式的 .NET API 规范,目标是在所有 .NET 实现中推出。推出 .NET Standard 的背后动机是要提高 .NET 生态系统中的一致性。

ECMA 335 持续为 .NET 实现行为建立统一性,但适用于 .NET 库实现的 .NET 基类库 (BCL) 没有类似的规范。

.NET Framework 4.6.1实现了.NET Standard  2.0.

.NET Standard 可实现以下重要情境:

1.为要实现的所有 .NET 实现定义一组统一的、与工作负荷无关的 BCL API。

2.使开发人员能够通过同一组 API 生成可在各种 .NET 实现中使用的可移植库。

3.减少甚至消除由于 .NET API 方面的原因而对共享源代码进行的条件性编译(仅适用于 OS API)。 

五、C# 6.0语言级别的新东西

5.1 属性可以连带赋值

5.2 导入静态类

5.3 字符串格式化的变化

5.4 空值运算符

5.5 对象初始化器

可以通过索引的方式进行赋值

1

2

3

4

5

IDictionary<intstring> dictNew = new Dictionary<intstring>()

{

       [4] = "first",

       [5] = "second"

};

5.6 异常过滤器

int exceptionValue = 10;

try

{

       Int32.Parse("s");

}

catch (Exception e) when (exceptionValue > 1)

{

       Console.WriteLine("catch");

}

5.7 nameof表达式

5.8 在属性/方法里面使用Lambda表达式

六、C# 7.0语言级别的新东西

6.1 out变量不需要申明了

var input = ReadLine();

if (int.TryParse(input, out var result))

{

    WriteLine("您输入的数字是:{0}",result);

}

else

{

    WriteLine("无法解析输入...");

}

6.2元组

 元组(Tuple)在 .Net 4.0 的时候就有了,但元组也有些缺点,如:

   1)Tuple 会影响代码的可读性,因为它的属性名都是:Item1,Item2.. 。

   2)Tuple 还不够轻量级,因为它是引用类型(Class)。

   备注:上述所指 Tuple 还不够轻量级,是从某种意义上来说的或者是一种假设,即假设分配操作非常的多。

 C# 7 中的元组(ValueTuple)解决了上述两个缺点:

   1)ValueTuple 支持语义上的字段命名。

   2)ValueTuple 是值类型(Struct)。

传统的创建方式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

  var tuple = (1, 2);                          

  var tuple2 = ValueTuple.Create(1, 2);        

  var tuple3 = new ValueTuple<intint>(1, 2); 

  (int one, int two) tuple = (1, 2);

  WriteLine($"first:{tuple.one}, second:{tuple.two}");

  var tuple2 = (one: 1, two: 2);

  WriteLine($"first:{tuple2.one}, second:{tuple2.two}");

  (int one, int two) tuple3 = (first: 1, second: 2);  

  WriteLine($"first:{tuple3.one}, second:{tuple3.two}");

6.3 解构

6.3.1解构元组 

6.3.2解构可以应用于 .Net 的任意类型,

但需要编写 Deconstruct 方法成员(实例或扩展)

 6.4 模式匹配

6.4.1 is 表达式(is expressions)

6.4.2 switch语句

1

2

3

4

5

6

7

8

9

10

11

12

switch (item)

  {

      case type variable1:

          break;

      case type variable2 when predicate:

          break;

      default:

          break;

  }

6.5 Ref locals and returns

 总结:虽然 C# 7 中提供了局部引用和引用返回,但为了防止滥用所以也有诸多约束,如:

 1. 你不能将一个值分配给 ref 变量,如:

1   ref int num = 10;   // error:无法使用值初始化按引用变量

 2. 你不能返回一个生存期不超过方法作用域的变量引用,如:

1 public ref int GetLocalRef(int num) => ref num;   // error: 无法按引用返回参数,因为它不是 ref 或 out 参数

 3. ref 不能修饰 “属性” 和 “索引器”。 

1   var list = new List<int>();2   ref var n = ref list.Count;  // error: 属性或索引器不能作为 out 或 ref 参数传递

 原理解析:非常简单就是指针传递,并且个人觉得此语法的使用场景非常有限,都是用来处理大对象的,目的是减少GC提高性能。

6.5 局部函数

6.6. 扩展异步返回类型(Generalized async return types) 

 以前异步的返回类型必须是:Task、Task<T>、void,现在 C# 7 中新增了一种类型:ValueTask<T>,如下所示:

  总结:ValueTask<T> 与 ValueTuple 非常相似,所以就不列举:ValueTask<T> 与 Task 之间的异同了,\但它们都是为了优化特定场景性能而

 新增的类型。  使用 ValueTask<T> 则需要导入:

Install - Package System.Threading.Tasks.Extensions

6.7. 数字文本语法的改进(Numeric literal syntax improvements) 

 C# 7 还包含两个新特性:二进制文字、数字分隔符,如下所示:

 注:二进制文本是以0b(零b)开头,字母不区分大小写;数字分隔符只有三个地方不能写:开头,结尾,小数点前后。

 总结:二进制文本,数字分隔符 可使常量值更具可读性。

七、异步的优化

  尽管如此,异步方法可以返回的内容是一些小改进,但是可以在某些情况下提供巨大的性能提升。 你不再需要返回一个Task,如果值已经可用, 这可以减少开销,使用async方法来创建Task对象。

八、总结

  在这个介绍性章节中,您看到了一个简短而高级的摘要,与先前版本相比,.NET Core 2和ASP.NET Core 2众多变化。

现在,你也知道了.NET Standard 2及其用途。我们展示了C#6和C#7中可用的一些新功能的例子。

这些可能非常有用的是让你用更少的东西编写更多东西,并使你的代码更易读和更容易维护。

       《ASP.NET Core 高性能系列》这是一本关于一般Web应用程序性能改进的文章,而且很多无视语言或框架的知识。

  下一章中,您将了解性能如何重要,并了解崭新的新.NET Core开发栈, 我们还将看到可用的工具,并了解用图表展示硬件性能。

原文地址:https://www.cnblogs.com/humble/p/11183201.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg

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

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

相关文章

Codeforces Round #599 (Div. 2) E. Sum Balance 图转换 + 子集dp + 环

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先我们知道如果所有数的和summodk!0sum\bmod k!0summodk!0那么此时无解&#xff0c;否则我们设needsum/kneedsum/kneedsum/k。 看到kkk这么小&#xff0c;自然的想到是否能状压&#xff…

资深开发者们是如何读书的?---线下读书会记录

读了多少书&#xff1f;怎么读书&#xff1f;——请问大家最近读书了吗&#xff1f;一年大概读了多少本书。有超过20本&#xff0c;超过30本&#xff0c;超过50本吗&#xff1f;在7月14日由长沙互联网活动基地和长沙.NET技术社区组织的小型社区活动&#xff0c;《开发者爱读书•…

架构杂谈《三》

一致性问题前面的《架构杂谈一》和《架构杂谈二》 杂谈了从服务化到微服务架构的演进&#xff0c;并肯定了服务化和微服务架构是一脉相承的。微服务在服务化架构的基础上&#xff0c;对服务化的细节和方案进行了优化和细化&#xff0c;重点突出了无中心化管理的微服务架构&…

腾讯发布 Tencent SCF Toolkit VS Code 插件,轻松开发无服务器云函数

在之前的文章中&#xff0c;我们提到了亚马逊、谷歌、IBM 等大厂都上了 Visual Studio Code 的船。阿里巴巴也在近日发布了 Aliyun Serverless VS Code 插件。近期&#xff0c;腾讯也上了 VS Code 的船&#xff0c;发布了基于 VS Code 的 Tencent SCF Toolkit 插件&#xff0c;…

端到端测试实践:Jenkins集成TestCafe

上一篇《对产品质量的一点思考》中说到自动化测试的重要性&#xff0c;本文简单介绍下怎样在实际项目中实现端到端测试的自动化&#xff0c;在这里我们使用的端到端测试工具是TestCafe。环境Jenkisn&#xff1a;2.183TestCafe&#xff1a;1.3.0为什么采用TestCafe做自动化测试要…

再见Jenkins,从Gitlab代码提交到k8s服务持续交付只需七毛三

Gitlab runner 快速搭建CICD pipeline背景日常开发中&#xff0c;相信大家已经做了很多的自动化运维环境&#xff0c;用的最多的想必就是利用Jenkins实现代码提交到自动化测试再到自动化打包&#xff0c;部署全流水线Jenkins在devops担任了很重要的角色&#xff0c;但是另一方面…

.NET Core 3.0之深入源码理解Kestrel的集成与应用(二)

前言前一篇文章主要介绍了.NET Core继承Kestrel的目的、运行方式以及相关的使用&#xff0c;接下来将进一步从源码角度探讨.NET Core 3.0中关于Kestrel的其他内容&#xff0c;该部分内容&#xff0c;我们无需掌握&#xff0c;依然可以用好Kestrel&#xff0c;本文只是将一些内部…

译 | 使用Roslyn分析器高效编写更好的代码

原文&#xff1a;Mika Dumont翻译&#xff1a;汪宇杰Roslyn 是 .NET 编译器平台&#xff0c;即使在运行代码之前&#xff0c;它也能帮助您捕获 Bug。例如内置于 Visual Studio 中的Roslyn 拼写检查分析器。假设您正在创建一个静态方法&#xff0c;并将 static 单词拼错为 statc…

Codeforces Round #724 (Div. 2) F. Omkar and Akmar 组合数学 + 博弈

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先我们先来研究一下这个游戏&#xff0c;手画几个会惊奇的发现&#xff0c;后手这个b怎么怎么画都赢啊&#xff1f;&#xff1f;&#xff1f;对&#xff0c;没错&#xff0c;就是怎么画都…

Visual Studio 支持 Java?谣言止于智者

在去年的某一段时间内&#xff0c;我们经常会看到标题类似为“宇宙第一 IDE Visual Studio 支持 Java 了&#xff01;”的文章。当时&#xff0c;韩老师看到这篇文章也是一脸懵逼。公司里做 Java 的开发童鞋们就坐在韩老师附近&#xff08;嗯&#xff0c;不超过五米的距离&…

Codeforces Round #597 (Div. 2) D. Shichikuji and Power Grid 最小生成树 + 虚拟点

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 看错题导致误入歧途&#xff0c;如果能早点看见翻译也不至于一天多也没想出来。 求联通的最小代价&#xff0c;自然的想到了能不能建边跑最小生成树。 对于两点之间比较好弄&#xff0c;直…

小白开学Asp.Net Core 《八》

小白开学Asp.Net Core 《八》— — .Net Core 数据保护组件1、背景我在搞&#xff08;https://github.com/AjuPrince/Aju.Carefree&#xff09;这个开源项目的时候&#xff0c;想做一些防止恶意攻击的小功能&#xff08;如果 我通过页面 /Dome/GetData?id123&#xff0c;那是不…

你必须知道的Docker镜像仓库的搭建

近期工作中发现用到的容器镜像越来越多&#xff08;不多的时候没考虑过镜像仓库的问题&#xff09;&#xff0c;同一个容器镜像也存在多个版本&#xff0c;那么镜像仓库的搭建需求就涌现出来&#xff0c;本文就目前的几个常用镜像仓库的搭建进行介绍&#xff0c;我们可以根据需…

nowcoder 河 我 车 题 错 天 乐 赛 倍增处理

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 倍增经典题了&#xff0c;考虑维护一个前缀和sum[i]sum[i]sum[i]&#xff0c;对于iii位置我们肯定是贪心的选能到的最远位置&#xff0c;即第一个>sum[i−1]k>sum[i-1]k>sum[i−1…

ASP.NET Core Web Api之JWT(一)

最近沉寂了一段&#xff0c;主要是上半年相当于休息和调整了一段时间&#xff0c;接下来我将开始陆续学习一些新的技能&#xff0c;比如Docker、Jenkins等&#xff0c;都会以生活实例从零开始讲解起&#xff0c;到时一并和大家分享和交流。接下来几节课的内容将会讲解JWT&#…

Codeforces Round #658 (Div. 2) D. Unmerge 思维 + 背包

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 我们可以假设有两个桶&#xff0c;让后向里面放数&#xff0c;可以发现&#xff0c;如果向其中放入了aia_iai​&#xff0c;那么紧跟在他后面的所有<ai<a_i<ai​的数都必须跟在ai…

撸过一万行代码,你看过这篇文章吗?

北上广深真的是技术的宝地吗&#xff1f;犹记得刚刚参加工作之后&#xff0c;有人邀请我去深圳&#xff0c;说沿海地区是IT行业从业人员的宝地&#xff0c;只有在那里才会学到真正的技术&#xff0c;而且能拿到更高的工资&#xff0c;不管从哪个层面来说&#xff0c;都值得你去…

Codeforces Round #595 (Div. 3) F. Maximum Weight Subset 树形dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤200n\le200n≤200 思路&#xff1a; 明显的树形dpdpdp&#xff0c;所以考虑一下dpdpdp状态。 这个题状态挺神的。。可能是因为我太菜了&#xff0c;看了半天才看懂。 算法111: 复杂度O(n3)O(n^3)O(n3) …

利用ICSharpCore搭建基于.NET Core的机器学习和深度学习的本地开发环境

每个人都习惯使用Python去完成机器学习和深度学习的工作&#xff0c;但是对于习惯于某种特定语言的人来说&#xff0c;转型不是那么容易的事。这两年我花了不少时间在Python&#xff0c;毕竟工作的重心也从移动开发转为机器学习和深度学习。感谢我的老板给我很大的空间去开拓新…

Acwing 252. 树 点分治

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 好久没写淀粉质了&#xff0c;心血来潮复习一下。 淀粉质通常用来统计路径个数&#xff0c;将路径分为子树内的和子树之间的。子树内的递归处理&#xff0c;子树间的存下信息来每次都处理即…