如何编写高性能的C#代码(一)

原文来自互联网,由长沙DotNET技术社区编译。如译文侵犯您的署名权或版权,请联系小编,小编将在24小时内删除。

作者介绍:

史蒂夫·戈登(Steve Gordon)是Microsoft MVP,Pluralsight的作者,布莱顿(英国西南部城市)的高级开发人员和社区负责人。

  

对于有追求的.NET开发者来说,如何编写高性能的C#代码一直是非常渴求的目标。作为一位.NET方向的MVP,Steve Gordon围绕这个方向,专门写了一个系列共7篇博客,主要探讨探讨支持编写更多性能,低分配代码的现代C#和.NET / .NET Core技术和功能。

译者注:本系列博客的发表时间为2019年2月18日,部分内容可能与新框架代码有些许不同,请自行验证。

本系列的文章包括:

1.编写高性能C#代码的动机2.使用Benchmark.NET对C# 代码进行基准测试的简介3.使用Span 优化代码的简介4.使用String.Create创建没有分配开销的字符串5.使用JetBrains dotMemory对.NET Core内存流量进行性能分析6.解释JetBrains dotMemory中的.NET Core内存时间线7.析JetBrains dotMemory中的大对象堆

第一部分:编写高性能C#代码的动机

这篇文章标志着我期望一系列与性能相关的文章的开始。我将在目录中使用该帖子,以访问这些将来的帖子,并通过讨论我的个人动机以学习更多有关编写高性能C#代码的个人动机来开始本系列文章。

我不确定100%该系列将带我去哪里,但我想使用System.IO.Pipelines,.NET Core 3.0中的新JSON解析器以及Span 和Memory 任何相关的主题。

为什么要编写高性能代码?

我一直对MVC框架和.NET Core之类的内部原理感兴趣。通过了解Microsoft团队如何设计和构建框架,我感到自己可以提高自己的编码能力,并且可以更好地使用该产品。自.NET Core和ASP.NET Core 1.0推出以来,性能一直是团队关注的重点。在过去一年左右的时间里,得到了更大的重视,因此,为了支持高性能方案,引入了新的类型和运行时功能。我看过.NET社区中一些关于性能的著名人物,他们发表了有关性能的文章,因此我决定现在也该深入了解了。

我在Twitter上关注了许多来自Microsoft和.NET社区的优秀人士,并每天获取鼓舞人心的内容。看到其他使ASP.NET Core更快,更高效并在其工作中使用新语言和框架功能的开发人员的帖子非常鼓舞人心。作为一名自学成才的开发人员,我经常觉得有必要学习更多有关我理解的知识。许多与性能相关的新功能对我来说还是个谜。我从概念上理解它们的存在,并且它们正在改进软件,但是我常常不确定为什么以及更重要的是它们如何做到这一点。

我不懂的东西 我喜欢学习,因此我花了一些时间阅读博客文章中的性能主题,观看视频以及参加会议上的演讲。该列表实在太大而无法在此处列出,但是对我来说,一些关键灵感是:

•《Writing High-Performance .NET Code[1]》(编写高性能.NET代码[2])由本·沃森编写。•《Pro .NET Memory Management: For Better Code, Performance, and Scalability[3]》by Konrad Kokosa•Blogs[4] and talks[5] by Adam Sitnik•来自亚当Sitnik的一些博客[6]和演讲[7]。•Marc Gravell的博客[8]•由.NET社区的许多成员,包括本·亚当斯和David Fowler发表的Tweets•Stephen Toub写在Microsoft博客

这并非详尽的清单。我已经从广泛的社区中获取了很多精彩的帖子和信息。我非常感谢我们有这么多内容!

什么是性能?

当我在本系列中谈论高性能时,我指的是两个主要概念。首先是使代码运行更快,从而使操作花费的时间更少。在Web应用程序的上下文中,这可能导致更快的页面加载时间或更快的API响应。对于处理一些传入数据以生成输出的服务工作者风格的应用程序,这与处理的总体吞吐量有关。我认为第二个重要因素是减少内存使用和分配。在我看来,这两个概念融合为“事半功倍”。

在数据处理工作流中,我将性能视为日常工作重点的一个典型示例。我花了很多时间来开发功能,该功能通常通过AWS队列来获取一些数据,并根据该消息执行一些工作。随着时间的推移,我们的许多服务都在增长和发展,如今正在处理大量数据。一个正在工作的示例就是一个队列处理器,它每天处理大约17-20百万条消息。阅读消息后,工作流将处理数据,对其进行验证,对其进行充实并对其进行整形以准备存储到S3和ElasticSearch集群。这个过程并不是很复杂,但是由于数量的原因,我们有一段时间必须水平扩展容器实例以确保我们继续实现所需的吞吐量。

能否提高效率,减少处理时间和内存消耗?我绝对确定可以。

性能的这两个支柱通常是内在联系在一起的,并且影响一个,可以影响另一个。例如,减少代码中的内存分配可以减少GC负载并减少由收集过程引起的暂停,从而可以提高总体速度。

代码过早优化?这也是个问题

当在我完成本系列的过程中,这可能会成为许多人争论的焦点,因此我有必要对这个问题进行讨论。我是否过早地进行了优化,并在复杂的、以性能为中心的代码中花费了太多的时间?

在我的一些示例中可能就是这种情况。我意识到,我正在使用的步骤通常会花费较长的时间编写代码,在某些情况下可读性较低,因此如果将来需要更改代码,则会增加负担。我试图在实验中突破极限,以找到划界的正确位置。

我不太喜欢过早优化这个术语,因为在讨论中它有时会很快被抛弃,并可能导致性能完全被忽略。我坚信性能应该成为我们或多或少编写的所有代码的功能。确定它的重要性以及关注的级别应该是故事计划中的前期讨论。

我认为,团队应该了解他们正在构建的每个功能的需求。他们应该检查预期的使用情况和预期的长期增长,以便适当地讨论可能影响性能的领域。

有时,这可能意味着不需要采取任何特定的措施,而在其他时候,它可能会确定应在早期考虑的巨大的将来扩展需求,因此应尽早采取措施以避免将来完全重写。

当我在这里谈论性能时,它可能很简单,例如确保通过Entity Framework进行的查询使用AsNoTracking支持来减少开销,或者它可能意味着对字节数据进行自定义解析以避免分配。哪个级别合适的范围应该通过预先的早期讨论来确定。

我并不是在提倡每个人都立即花费数周的时间来重写现有代码,以使用Span 和许多其他闪亮的.NET Core功能。我要提倡的是对现有工具的了解,这些工具可以编写快速,低分配的代码,以便就何时使用这些代码提供决策。如果您有代码或服务难以跟上,请安排一些时间来检查问题。

对应用程序进行基准测试和性能分析,以了解有关问题所在和适当情况的更多信息,然后开始使用一些新工具来改进代码并稳定服务。

我举了一个我维护的队列处理器的示例,该处理器处理数百万个事件。两年半以前,当它第一次用.NET Core 1.0编写时,我们做出了一些当时有效的选择。随着其用途的增加以及我们更加全面地了解需求,现在我们计划对其进行审查。

我们当前扩展实例以处理负载的解决方案效果很好,但是我敢肯定,如果我们减少频繁扩展的需求,那么我们可以省钱。作为一家企业,我们需要在变更成本与扩展补偿成本之间取得平衡。

对于新的队列处理器,我们可以从这一经验中学习,并预先考虑它们的扩展需求。

新服务会迅速发展吗?它需要处理越来越多的事件或数据吗?我们能以不同的方式做事,为未来的服务树立一个更好的先例吗?我坚信我们可以做到,而且我已经花了一些时间在这些领域构建新想法的原型。

我无论是在工作还是在家里我都会集中时间关注这件目标,并不断的发现这些功能的局限性,了解什么时候使用它们是合适的,同时我也希望希更多的读者也参与进来。

摘要

尽管我没有涵盖本文中的任何特定内容,但我希望这篇文章能够解释为什么我很高兴了解更多有关性能功能的信息。在接下来的几周和几个月中,我将分享帖子,以分享我对所调查的每件事的经验。

谢谢阅读!如果您想了解有关高性能.NET和C#代码的更多信息,可以在此处[9]查看我的完整博客文章系列。

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

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

相关文章

从Java转向.NET/C#,Are You OK?

最近由于项目变动,需要用.NET/C#做开发,经过一段时间的学习和培训,对这个技术栈有了一定的理解。大家可能都知道Java和.NET/C#很像,这里粗略的把两者做一个对比,希望对感兴趣的童鞋有所帮助。如果现在有人问我&#xf…

树的节点值之和

题目背景 墨家家主有棵树。 题目描述 给定一个保存树节点信息的数据结构,它包含了树节点唯一的 id ,树节点值 和 直系子节点的 id 。 比如,树节点1是树节点2的父节点,树节点2是树节点3的父节点。他们相应的树节点值为 9 , 4 , …

.NET Core开发实战(第21课:中间件:掌控请求处理过程的关键)--学习笔记(上)...

21 | 中间件:掌控请求处理过程的关键这一节讲解一下如何通过中间件来管理请求处理过程中间件工作原理next 表示后面有一个委托,每一层每一层套下去可以在任意的中间件来决定在后面的中间件之前执行什么,或者说在所有中间件执行完之后执行什么…

简单的二叉树创建与遍历

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后&…

疫情期间,千万级系统宕机N次,老板撂下狠话:没法把性提升10倍,全员解雇!...

性能调优整体思路作为一名团队技术核心,如何让系统跑得通、跑得稳、跑得快是必然会面对的场景。性能分析是一个大课题,不同的架构、不同的应用场景、不同的程序语言分析的方法若有差异,抽象一下大致分为两类:自底向上:…

Anaconda创建python虚拟环境

在创建虚拟环境之前首先我们需要打开命令终端:Win R 输入cmd 或者直接打开Anaconda Prompt(Anaconda) pycharm下载历史版本地址:https://www.jetbrains.com/pycharm/download/other.html Anaconda下载历史版本地址:ht…

[蓝桥杯][算法提高VIP]夺宝奇兵-递推+记忆化搜索

题目描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 ”夺宝奇兵”从山下出发,到达山顶,如何选路才能得到最多的珠宝呢?在上图所示例子中,按照5-> 7-> 8-&g…

梯度下降与线性回归

对于代价函数: loss∑i(y^−yi)2loss\sum_i{(\hat{y}-y_i)}^2loss∑i​(y^​−yi​)2 loss∑i(w∗xib−yi)2loss\sum_i{(w*x_ib-y_i)}^2loss∑i​(w∗xi​b−yi​)2 最常见的代价函数:均方差代价函数(Mean-Square Error,MSE&…

.NET Core开发实战(第21课:中间件:掌控请求处理过程的关键)--学习笔记(下)...

21 | 中间件:掌控请求处理过程的关键如果在 Map 的时候逻辑复杂一点,不仅仅判断它的 URL 地址,而且要做特殊的判断的话,可以这么做把判断逻辑变成一个委托我们要判断当我们的请求地址包含 abc 的时候,输出 new abcapp.…

英伟达3060Ti安装GPU版本TensorFlow2.X和Pytorch

查看Python与TensorFlow对应版本 安装GPU版本的TensorFlow的时候,我们需要考虑的一个问题是Python版本与TensorFlow版本的对应关系,可以参考下面这个链接: Python对应TensorFlow CPU版本 GPU版本 查看显卡驱动对应的CUDA版本并且下载安装 …

200行代码,7个对象——让你了解ASP.NET Core框架的本质[3.x版]

2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为《ASP.NET Core框架揭秘》的分享。在此次分享中,我按照ASP.NET Core自身的运行原理和设计思想创建了一个 “迷你版” 的ASP.NET Core框架&…

逻辑回归(二)

逻辑回归 在学习逻辑回归之前我们先回顾一下线性回归。线性回归解决的是回归问题,简单来说就是,我们需要找到一个函数,这个函数需要尽可能的拟合所有训练集的样本点。 逻辑回归解决的是分类问题,它的目标是找到一个函数&#x…

上元节的灯会(灭)-区间dp

题目背景 上元节的庙会上,牛宝靠自己的聪明才智成功破解了花灯阵,点亮了在场所有花灯,但他没料到的是这个游戏包含AB两个项目,A项目就是点亮所有花灯,而B项目则是熄灭所有花灯。不过点亮的是花灯阵,熄灭的…

Asp.Net Core 中IdentityServer4 授权中心之应用实战

一、前言查阅了大多数相关资料,搜索到的IdentityServer4 的应用文章大多是比较简单并且多是翻译官网的文档编写的,我这里在 Asp.Net Core 中IdentityServer4 的应用分析中会以一个电商系统架构升级过程中普遍会遇到的场景进行实战性讲述分析,…

交通标志识别项目教程

项目结构图 下载好项目压缩包后解压,得到以上的文件,首先将画红圈的文件删除(如果有) 安装软件 安装Anaconda 安装Pycharm 安装格式工厂 在上图中这个位置输入cmd回车,即可打开命令终端。用这样的方式打开命令终端…

C# 视频监控系统

去过工厂或者仓库的都知道,在工厂或仓库里面,会有很多不同的流水线,大部分的工厂或仓库,都会在不同流水线的不同工位旁边安装一台电脑,一方面便于工位上的师傅把产品的重要信息录入系统,便于公司系统数据采…

sklearn svm如何选择核函数_机器学习之支持向量机多种核模型对比

机器学习xueyifeiyun1989zx,公众号:围着围巾的小黑机器学习之监督学习实战前文我们提到机器学习中的监督学习,其中有一个模型是我们提到的但是没有训练测试的,叫做支持向量机(简称SVM)。支持向量机也是监督学习里面一个非常容易理…

程序员过关斩将--从每秒6000写请求谈起

点击上方“蓝字”关注我们菜菜哥,紧急求助呀怎么回事?产品经理砍你了?没有,只是写了个新项目,上线就被压垮了什么功能,这么强悍?一个记录用户观看视频进度信息的功能那如果用户基数大&#xff0…

批量将PPM格式图片转化为JPG格式

将PPM格式图片转化为JPG格式 做图像识别的时候数据集常常是ppm格式的,虽然不影响建模训练,但是我们电脑往往不支持ppm格式的图像展示。 比如到做交通标志识别的时候用到的BelgiumTS交通数据集或者德国GTSRB数据集 下载后得到都是ppm格式的图像。 格式转…

Magicodes.IE 2.2里程碑需求和建议征集

简介Magicodes.IE是导入导出通用库,支持Dto导入导出以及动态导出,支持Excel、Word、Pdf、Csv和Html。已加入NCC开源组织。Magicodes.IE 2.0发布Github:https://github.com/dotnetcore/Magicodes.IE码云(手动同步,不维护…