如何编写高性能的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,一经查实,立即删除!

相关文章

hdu 2069 Coin Change(改)-dp

有5种面值的硬币&#xff0c;即1分&#xff0c;5分&#xff0c;10分&#xff0c;25分&#xff0c;50分。输入一个钱数s&#xff0c;输出组合方案的数量。 s<250&#xff0c;硬币数量不限。 代码如下&#xff1a; #include <iostream> using namespace std; const i…

博途plc连接电脑_PLC报错,电脑连接不了PLC

需要进行S7-1200的固件版本更新。更新CPU的固件具体步骤如下&#xff1a;第一步&#xff1a;使用电脑通过读卡器清除存储卡中内容。注意&#xff1a;不要格式化存储卡&#xff01;第二步&#xff1a; 从西门子官方网站下载最新版本的固件文件。下载并解压缩&#xff0c;用户可以…

SQL(八)- python执行SQL语句

PyMySQL python 3.x版本中连接MySQL数据库使用第三方库pysqhl&#xff1b;python 2.x版本中连接MySQL数据库使用第三方库mysqldb&#xff1b; 连接PyMySQL 安装&#xff1a; pip install pymysql连接 (1)用python连接mysql&#xff0c;执行sql语句&#xff0c;返回mysql当…

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

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

如何看待潘石屹搞python_潘石屹考了99分的Python,到底是一种什么存在?

去年&#xff0c;当地产大佬潘石屹要把学习Python作为生日礼物送给自己的时候&#xff0c;微博上还多是一阵调侃之声。可能正是印证了Python程序员们常常挂在嘴边的“人生苦短&#xff0c;就学Python”的口头禅&#xff0c;时年56岁的小潘同学要再一次抓住“青春”的尾巴吧。为…

python机器学习、数据分析常用第三方库(实时更新)

常用镜像源&#xff1a; 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里&#xff1a;http://mirrors.aliyun.com/pypi/simple/ 豆瓣&#xff1a;http://pypi.douban.com/simple/ 华中理工大学&#xff1a;http://pypi.hustunique.com/ 山东理工大学&#xff…

树的节点值之和

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

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

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

angularjsl路由_AngularJs ng-route路由详解

本篇基于ng-route来讲下angular中的路由&#xff0c;路由功能主要是 $routeProvider服务 与 ng-view 实现。ng-view的实现原理&#xff0c;是根据路由的切换&#xff0c;动态编译html模板——$compile(html)(scope)。前提首先需要在页面引入angular和angular-route&#xff0c;…

pandas中Series的map函数详解

Series的map函数 Series的map方法可以接受一个函数或含有映射关系的字典型对象。使用map是一种实现元素级转换以及其他数据清理工作的便捷方式。DataFrame中对应的是applymap()函数&#xff0c;当然DataFrame还有apply()函数 1.字典映射 例如&#xff0c;对数据的某个字段进…

简单的二叉树创建与遍历

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

tof摄像头手势识别_一种基于TOF手势识别的控制系统的制作方法

本发明属于汽车零配件技术领域&#xff0c;尤其是一种基于TOF手势识别的控制系统。背景技术&#xff1a;随着触摸屏技术的不断推广&#xff0c;用户已经适应并逐渐熟悉了与机器的互动。现在&#xff0c;人机互动技术已迈上了更高的台阶&#xff0c;进入了手势识别时代。随着手势…

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

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

Pandas - 查看DataFrame信息

数据表信息查看 1、维度查看&#xff1a; df.shape2、数据表基本信息&#xff08;维度、列名称、数据格式、所占空间等&#xff09;&#xff1a; df.info()3、每一列数据的格式&#xff1a; df.dtypes4、某一列格式&#xff1a; df[B].dtype5、空值&#xff1a; df.isnul…

hdu2602 Bone Collector-01背包问题

Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave … The bone collector had a big bag with a volume of…

对比Java和.NET多线程编程

这篇文章以对比的方式总结Java和.NET多线程编程。基本概念多线程&#xff1a;很多开发语言都提供多线程编程支持&#xff0c;比如Java&#xff0c;C#。并发&#xff08;concurrent&#xff09;&#xff1a;即使对于单核CPU&#xff0c;我们也会采用多线程等技术提高service的并…

Anaconda创建python虚拟环境

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

vue2实践揭秘pdf_《Vue2.0 实践揭秘》终于出版啦!

不知不觉间在园子开博都两年多了&#xff0c;最近一些园友问最近去哪了为何都没有新的文章了。最近确实发生了很多的事&#xff0c;一是忙工作二就是忙着写书。这还得多些园子的小编&#xff0c;自两年前发表的“架构师修炼”系列的文章后被出版社相出让我将这个主题写成书&…

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

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

这些年我对微服务的理解

Monolith、SOA、DDD、The two-pizza rule、分库分表这些概念跟微服务有啥关系&#xff0c;你知道吗&#xff1f;这篇文章记录我的理解&#xff0c;分享给大家。微服务&#xff08;micro service&#xff09;&#xff0c;个人感觉也就近几年才吵起来的概念&#xff0c;记得退回去…