首頁 後端開發 C#.Net教程 詳細介紹.NET中的效能改進

詳細介紹.NET中的效能改進

Mar 09, 2017 pm 03:41 PM

  .NET 4.6中带来了一些与性能改进相关的CLR特性,这些特性中有一部分将会自动生效,而另外一些特性,例如SIMD与异步本地存储(Async Local Storage)则需要对编写应用的方式进行某些改动。

  SIMD

  Mono团队一直以他们对SIMD,即单指令流多数据流特性的支持引以为傲。SIMD是一种CPU指令集,它能够在同一时间对最多8个值进行同一操作。而随着.NET CLR版本4.6的推出,Windows开发者终于也能够使用这一特性了。

  为了实际观察一下SIMD的效果,可以参考一下这个示例。假设你需要通过c[i] = a[i] + b[i]这种形式对两个数组进行相加,以得到第三个数组。通过使用SIMD,你可以按照以下方式编写代码:

for (int i = 0; i < size; i += Vector.Count)
 {
     Vectorv = new Vector(A,i) + new Vector(B,i);
     v.CopyTo(C,i);
 }
登入後複製

  请注意这个循环是如何按Vector.Count的取值进行递增的,根据CPU类型的不同,它的取值可能是4或是8。.NET JIT编译器将根据CPU的不同生成相应的代码,以4或8的值对数组进行批量相加。

  这种方式看起来有些繁琐,因此微软还提供了一系列辅助类,包括:

  • Matrix3x2 结构

  • Matrix4x4结构

  • Plane结构

  • Quaternion结构

  • Vector 类

  • Vector(T) 结构

  • Vector2结构

  • Vector3结构

  • Vector4结构

  程序集卸载

  恐怕大多数开发者都不知道这一点:.NET经常会对同一个程序集加载两次。发生这种情况的条件是.NET首先加载了某个程序集的IL版本,随后又加载了同一程序集的NGEN版本(即预编译版本)。这种方式对于物理内存来说是相当严重的浪费,尤其是对诸如Visual Studio这样的大型32位应用程序来说更为明显。

  而在.NET 4.6中,一旦CLR加载了某个程序集的NGEN版本,它会自动清空对应的IL版本所占用的内存。

  垃圾回收

  早先我们曾讨论过.NET 4.0中所引入的垃圾回收滞后时间模式,虽然这种方式比起让GC完全停止一段时间的做法要可靠许多,但对于许多GC场景来说,这种方式仍算不上完整。

  在.NET 4.6中,你将能够通过一种更精密的方式临时中止垃圾回收器的运作,新的TryStartNoGCRegion方法允许你指定在小对象以及大对象的堆中需要多少内存。

  如果出现内存不足的情况,运行时将会返回false,或是停止运行,直到通过GC清理得到足够的内存为止。你可以通过为TryStartNoGCRegion传入某个标记的方式控制这一行为,如果你成功地进入了某个无GC区域(在过程结束前不允许进行GC),那么在过程结束时必须调用EndNoGCRegion方法。

  在官方文档中并没有说明该方法是否是线程安全的,不过考虑到GC的工作原理,你应当尽量避免让两个进程同时尝试改变GC状态的做法。

  对于GC的另一项改进是它处理pinned对象(即一旦分配后不可移动位置的对象)的方式。虽然在文档中对此方面的描述有些语焉不详,但当你固定了某个对象的位置时,通常也会固定其相邻对象的位置。Rich Lander在文中写道:

GC将以一种更优化的方式处理pinned对象,因此GC能够将pinned对象周围的内存进行更有效地压缩。对于大量使用pin方式的大规模应用来说,这一改动将极大地改进应用的性能。

  GC对于如何使用较早的几代中的内存方面也体现出更好的智能性,Rich继续写道:

第1代对象升级为第2代对象的方式也得到了改进,以更有效地使用内存。在为某一代分配新的内存空间之前,GC会先尝试使用可用的空间。同时,在利用可用空间区域创建对象时使用了新的算法,使新分配的空间大小比起从前更接近于对象的大小。

  异步本地存储

  最后一项改进与性能并没有直接的关系,但通过有效的利用仍然能达到优化的效果。在异步API还没有流行起来的年代,开发者可以利用线程本地存储(TLS)缓存信息。TLS对于某个特定的线程来说就像是一种全局对象,这意味着你可以直接访问上下文信息并进行缓存,而无需显式地传递某种上下文对象。

  而在async/await模式中,線程本地存儲就變得毫無用武之地了。因為每次呼叫await的時候,都有可能跳到另一個執行緒。而且即使僥倖避開了這種情況,但其它代碼也有可能跳到你的線程中並幹擾TLS中的信息。

  新版的.NET引入了異步本地存儲(ALS)機制以解決這一問題,ALS在語義上等價於線程本地存儲,但它能夠隨著await的調用進行相應的跳轉。這項功能將透過AsyncLocal泛型類別實現,其內部將呼叫CallContext物件用於保存資料。


以上是詳細介紹.NET中的效能改進的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

C#的就業前景如何 C#的就業前景如何 Oct 19, 2023 am 11:02 AM

無論您是初學者還是有經驗的專業人士,掌握C#將為您的職業發展鋪平道路。

分享幾個.NET開源的AI和LLM相關專案框架 分享幾個.NET開源的AI和LLM相關專案框架 May 06, 2024 pm 04:43 PM

當今人工智慧(AI)技術的發展如火如荼,它們在各個領域都展現了巨大的潛力和影響力。今天大姚給大家分享4個.NET開源的AI模型LLM相關的專案框架,希望能為大家提供一些參考。 https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel是一種開源的軟體開發工具包(SDK),旨在將大型語言模型(LLM)如OpenAI、Azure

PHP8的效能改進和優勢有哪些? PHP8的效能改進和優勢有哪些? Jan 13, 2024 pm 12:24 PM

PHP8帶來的效能改進和優勢是什麼?自1995年誕生以來,PHP一直是最受歡迎的伺服器端腳本語言之一。 PHP8是PHP的最新版本,從2020年末開始正式發布。 PHP8帶來了許多令人興奮的新功能和改進,尤其是在性能方面。本文將介紹PHP8的一些關鍵效能改進和優勢,並提供具體的程式碼範例。 JIT編譯器PHP8引進了JIT(Just-In-Time)編譯器,這是一

面向開發人員的.NET效能最佳化技術 面向開發人員的.NET效能最佳化技術 Sep 12, 2023 am 10:43 AM

如果你是.NET開發者,你必須意識到在交付高品質軟體方面,優化功能和效能的重要性。透過熟練使用提供的資源並減少網站載入時間,你不僅為使用者創造了愉快的體驗,還能減少基礎設施成本。

Java框架與.NET框架的效能差異 Java框架與.NET框架的效能差異 Jun 03, 2024 am 09:19 AM

在高並發請求處理方面,.NETASP.NETCoreWebAPI效能優於JavaSpringMVC,原因包括:AOT提前編譯,減少啟動時間;更精細的記憶體管理,由開發人員負責分配和釋放物件記憶體。

Vue Router Lazy-Loading路由的使用方法以及它對頁面效能的改進效果 Vue Router Lazy-Loading路由的使用方法以及它對頁面效能的改進效果 Sep 15, 2023 pm 02:10 PM

VueRouterLazy-Loading路由的使用方法以及它對頁面效能的改進效果隨著前端應用的複雜度越來越高,前端路由的管理也變得愈加重要。 Vue.js作為一個主流的前端框架,其內建的VueRouter提供了非常強大的路由管理功能,能夠幫助我們建立靈活且高效的單一頁面應用程式。其中,VueRouterLazy-Loading是一項非常重要且實用的功能,

numpy版本更新解讀:新特性與改進的效能 numpy版本更新解讀:新特性與改進的效能 Jan 19, 2024 am 10:11 AM

隨著資料科學和深度學習的不斷發展,Python作為主流的程式語言之一,其科學計算庫numpy也不斷推陳出新。最近,numpy發布了新的版本,其中包含了一些新功能和效能改進。在這篇文章中,我們將深入探討numpy的新版本,介紹其中一些重要的功能和改進。 shuffle函數改進在numpy1.17.0之前,shuffle函數會將陣列元素依照隨機順序重新排序。然

C#.NET面試問題和答案:提高您的專業知識 C#.NET面試問題和答案:提高您的專業知識 Apr 07, 2025 am 12:01 AM

C#.NET面試問題和答案包括基礎知識、核心概念和高級用法。 1)基礎知識:C#是微軟開發的面向對象語言,主要用於.NET框架。 2)核心概念:委託和事件允許動態綁定方法,LINQ提供強大查詢功能。 3)高級用法:異步編程提高響應性,表達式樹用於動態代碼構建。

See all articles