日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

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

發(fā)布時間:2023/12/4 C# 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何编写高性能的C#代码(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文來自互聯(lián)網(wǎng),由長沙DotNET技術(shù)社區(qū)編譯。如譯文侵犯您的署名權(quán)或版權(quán),請聯(lián)系小編,小編將在24小時內(nèi)刪除。

作者介紹:

史蒂夫·戈登(Steve Gordon)是Microsoft MVP,Pluralsight的作者,布萊頓(英國西南部城市)的高級開發(fā)人員和社區(qū)負責(zé)人。

??

對于有追求的.NET開發(fā)者來說,如何編寫高性能的C#代碼一直是非常渴求的目標(biāo)。作為一位.NET方向的MVP,Steve Gordon圍繞這個方向,專門寫了一個系列共7篇博客,主要探討探討支持編寫更多性能,低分配代碼的現(xiàn)代C#和.NET / .NET Core技術(shù)和功能。

譯者注:本系列博客的發(fā)表時間為2019年2月18日,部分內(nèi)容可能與新框架代碼有些許不同,請自行驗證。

本系列的文章包括:

1.編寫高性能C#代碼的動機2.使用Benchmark.NET對C# 代碼進行基準(zhǔn)測試的簡介3.使用Span?優(yōu)化代碼的簡介4.使用String.Create創(chuàng)建沒有分配開銷的字符串5.使用JetBrains dotMemory對.NET Core內(nèi)存流量進行性能分析6.解釋JetBrains dotMemory中的.NET Core內(nèi)存時間線7.析JetBrains dotMemory中的大對象堆

第一部分:編寫高性能C#代碼的動機

這篇文章標(biāo)志著我期望一系列與性能相關(guān)的文章的開始。我將在目錄中使用該帖子,以訪問這些將來的帖子,并通過討論我的個人動機以學(xué)習(xí)更多有關(guān)編寫高性能C#代碼的個人動機來開始本系列文章。

我不確定100%該系列將帶我去哪里,但我想使用System.IO.Pipelines,.NET Core 3.0中的新JSON解析器以及Span?和Memory?任何相關(guān)的主題。

為什么要編寫高性能代碼?

我一直對MVC框架和.NET Core之類的內(nèi)部原理感興趣。通過了解Microsoft團隊如何設(shè)計和構(gòu)建框架,我感到自己可以提高自己的編碼能力,并且可以更好地使用該產(chǎn)品。自.NET Core和ASP.NET Core 1.0推出以來,性能一直是團隊關(guān)注的重點。在過去一年左右的時間里,得到了更大的重視,因此,為了支持高性能方案,引入了新的類型和運行時功能。我看過.NET社區(qū)中一些關(guān)于性能的著名人物,他們發(fā)表了有關(guān)性能的文章,因此我決定現(xiàn)在也該深入了解了。

我在Twitter上關(guān)注了許多來自Microsoft和.NET社區(qū)的優(yōu)秀人士,并每天獲取鼓舞人心的內(nèi)容。看到其他使ASP.NET Core更快,更高效并在其工作中使用新語言和框架功能的開發(fā)人員的帖子非常鼓舞人心。作為一名自學(xué)成才的開發(fā)人員,我經(jīng)常覺得有必要學(xué)習(xí)更多有關(guān)我理解的知識。許多與性能相關(guān)的新功能對我來說還是個謎。我從概念上理解它們的存在,并且它們正在改進軟件,但是我常常不確定為什么以及更重要的是它們?nèi)绾巫龅竭@一點。

我不懂的東西 我喜歡學(xué)習(xí),因此我花了一些時間閱讀博客文章中的性能主題,觀看視頻以及參加會議上的演講。該列表實在太大而無法在此處列出,但是對我來說,一些關(guān)鍵靈感是:

?《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?來自亞當(dāng)Sitnik的一些博客[6]和演講[7]。?Marc Gravell的博客[8]?由.NET社區(qū)的許多成員,包括本·亞當(dāng)斯和David Fowler發(fā)表的Tweets?Stephen Toub寫在Microsoft博客

這并非詳盡的清單。我已經(jīng)從廣泛的社區(qū)中獲取了很多精彩的帖子和信息。我非常感謝我們有這么多內(nèi)容!

什么是性能?

當(dāng)我在本系列中談?wù)摳咝阅軙r,我指的是兩個主要概念。首先是使代碼運行更快,從而使操作花費的時間更少。在Web應(yīng)用程序的上下文中,這可能導(dǎo)致更快的頁面加載時間或更快的API響應(yīng)。對于處理一些傳入數(shù)據(jù)以生成輸出的服務(wù)工作者風(fēng)格的應(yīng)用程序,這與處理的總體吞吐量有關(guān)。我認為第二個重要因素是減少內(nèi)存使用和分配。在我看來,這兩個概念融合為“事半功倍”。

在數(shù)據(jù)處理工作流中,我將性能視為日常工作重點的一個典型示例。我花了很多時間來開發(fā)功能,該功能通常通過AWS隊列來獲取一些數(shù)據(jù),并根據(jù)該消息執(zhí)行一些工作。隨著時間的推移,我們的許多服務(wù)都在增長和發(fā)展,如今正在處理大量數(shù)據(jù)。一個正在工作的示例就是一個隊列處理器,它每天處理大約17-20百萬條消息。閱讀消息后,工作流將處理數(shù)據(jù),對其進行驗證,對其進行充實并對其進行整形以準(zhǔn)備存儲到S3和ElasticSearch集群。這個過程并不是很復(fù)雜,但是由于數(shù)量的原因,我們有一段時間必須水平擴展容器實例以確保我們繼續(xù)實現(xiàn)所需的吞吐量。

能否提高效率,減少處理時間和內(nèi)存消耗?我絕對確定可以。

性能的這兩個支柱通常是內(nèi)在聯(lián)系在一起的,并且影響一個,可以影響另一個。例如,減少代碼中的內(nèi)存分配可以減少GC負載并減少由收集過程引起的暫停,從而可以提高總體速度。

代碼過早優(yōu)化?這也是個問題

當(dāng)在我完成本系列的過程中,這可能會成為許多人爭論的焦點,因此我有必要對這個問題進行討論。我是否過早地進行了優(yōu)化,并在復(fù)雜的、以性能為中心的代碼中花費了太多的時間?

在我的一些示例中可能就是這種情況。我意識到,我正在使用的步驟通常會花費較長的時間編寫代碼,在某些情況下可讀性較低,因此如果將來需要更改代碼,則會增加負擔(dān)。我試圖在實驗中突破極限,以找到劃界的正確位置。

我不太喜歡過早優(yōu)化這個術(shù)語,因為在討論中它有時會很快被拋棄,并可能導(dǎo)致性能完全被忽略。我堅信性能應(yīng)該成為我們或多或少編寫的所有代碼的功能。確定它的重要性以及關(guān)注的級別應(yīng)該是故事計劃中的前期討論。

我認為,團隊?wèi)?yīng)該了解他們正在構(gòu)建的每個功能的需求。他們應(yīng)該檢查預(yù)期的使用情況和預(yù)期的長期增長,以便適當(dāng)?shù)赜懻摽赡苡绊懶阅艿念I(lǐng)域。

有時,這可能意味著不需要采取任何特定的措施,而在其他時候,它可能會確定應(yīng)在早期考慮的巨大的將來擴展需求,因此應(yīng)盡早采取措施以避免將來完全重寫。

當(dāng)我在這里談?wù)撔阅軙r,它可能很簡單,例如確保通過Entity Framework進行的查詢使用AsNoTracking支持來減少開銷,或者它可能意味著對字節(jié)數(shù)據(jù)進行自定義解析以避免分配。哪個級別合適的范圍應(yīng)該通過預(yù)先的早期討論來確定。

我并不是在提倡每個人都立即花費數(shù)周的時間來重寫現(xiàn)有代碼,以使用Span?和許多其他閃亮的.NET Core功能。我要提倡的是對現(xiàn)有工具的了解,這些工具可以編寫快速,低分配的代碼,以便就何時使用這些代碼提供決策。如果您有代碼或服務(wù)難以跟上,請安排一些時間來檢查問題。

對應(yīng)用程序進行基準(zhǔn)測試和性能分析,以了解有關(guān)問題所在和適當(dāng)情況的更多信息,然后開始使用一些新工具來改進代碼并穩(wěn)定服務(wù)。

我舉了一個我維護的隊列處理器的示例,該處理器處理數(shù)百萬個事件。兩年半以前,當(dāng)它第一次用.NET Core 1.0編寫時,我們做出了一些當(dāng)時有效的選擇。隨著其用途的增加以及我們更加全面地了解需求,現(xiàn)在我們計劃對其進行審查。

我們當(dāng)前擴展實例以處理負載的解決方案效果很好,但是我敢肯定,如果我們減少頻繁擴展的需求,那么我們可以省錢。作為一家企業(yè),我們需要在變更成本與擴展補償成本之間取得平衡。

對于新的隊列處理器,我們可以從這一經(jīng)驗中學(xué)習(xí),并預(yù)先考慮它們的擴展需求。

新服務(wù)會迅速發(fā)展嗎?它需要處理越來越多的事件或數(shù)據(jù)嗎?我們能以不同的方式做事,為未來的服務(wù)樹立一個更好的先例嗎?我堅信我們可以做到,而且我已經(jīng)花了一些時間在這些領(lǐng)域構(gòu)建新想法的原型。

我無論是在工作還是在家里我都會集中時間關(guān)注這件目標(biāo),并不斷的發(fā)現(xiàn)這些功能的局限性,了解什么時候使用它們是合適的,同時我也希望希更多的讀者也參與進來。

摘要

盡管我沒有涵蓋本文中的任何特定內(nèi)容,但我希望這篇文章能夠解釋為什么我很高興了解更多有關(guān)性能功能的信息。在接下來的幾周和幾個月中,我將分享帖子,以分享我對所調(diào)查的每件事的經(jīng)驗。

謝謝閱讀!如果您想了解有關(guān)高性能.NET和C#代碼的更多信息,可以在此處[9]查看我的完整博客文章系列。

總結(jié)

以上是生活随笔為你收集整理的如何编写高性能的C#代码(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。