suchen
HeimBackend-EntwicklungC#.Net-TutorialEin detaillierter Blick auf Leistungsverbesserungen in .NET

.NET 4.6 bringt einige CLR-Funktionen mit sich, die sich auf Leistungsverbesserungen beziehen. Einige dieser Funktionen werden automatisch wirksam, während andere, wie SIMD und Async Local Storage, Änderungen an der Art und Weise erfordern, wie Anwendungen geschrieben werden.

SIMD

Das Mono-Team war schon immer stolz auf die Unterstützung von SIMD, der Single-Instruction-Stream-Multiple-Data-Stream-Funktion. SIMD ist ein CPU-Befehlssatz, der den gleichen Vorgang für bis zu 8 Werte gleichzeitig ausführen kann. Mit der Einführung von .NET CLR Version 4.6 können Windows-Entwickler diese Funktion endlich nutzen.

Um die Wirkung von SIMD tatsächlich zu beobachten, können Sie sich auf dieses Beispiel beziehen. Angenommen, Sie müssen zwei Arrays in der Form c[i] = a[i] + b[i] hinzufügen, um ein drittes Array zu erhalten. Durch die Verwendung von SIMD können Sie Code auf folgende Weise schreiben:

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

Beachten Sie, wie diese Schleife um den Wert von Vector.Count erhöht wird, der je nach CPU-Typ 4 oder 8 sein kann. Der .NET JIT-Compiler generiert entsprechenden Code, um die Arrays je nach CPU mit einem Wert von 4 oder 8 stapelweise hinzuzufügen.

Diese Methode erscheint etwas umständlich, daher bietet Microsoft auch eine Reihe von Hilfsklassen an, darunter:

  • Matrix3x2-Struktur

  • Matrix4x4-Struktur

  • Flugzeugstruktur

  • Quaternionstruktur

  • Vektorklasse

  • Vektor(T)-Struktur

  • Vector2-Struktur

  • Vector3-Struktur

  • Vector4-Struktur

Deinstallation der Baugruppe

Ich fürchte, die meisten Entwickler wissen das nicht: .NET lädt oft dieselbe Assembly zweimal. Voraussetzung hierfür ist, dass .NET zunächst die IL-Version einer Assembly und anschließend die NGEN-Version (d. h. die vorkompilierte Version) derselben Assembly lädt. Dieser Ansatz stellt eine erhebliche Verschwendung von physischem Speicher dar, insbesondere bei großen 32-Bit-Anwendungen wie Visual Studio.

Sobald die CLR in .NET 4.6 die NGEN-Version einer Assembly lädt, löscht sie automatisch den von der entsprechenden IL-Version belegten Speicher.

Müllabfuhr

Zuvor haben wir den in .NET 4.0 eingeführten Garbage Collection-Verzögerungsmodus besprochen. Obwohl diese Methode viel zuverlässiger ist, als den GC für einen bestimmten Zeitraum vollständig anzuhalten, reicht sie für viele GC-Szenarien immer noch nicht aus.

In .NET 4.6 können Sie den Garbage Collector auf komplexere Weise vorübergehend anhalten. Mit der neuen TryStartNoGCRegion-Methode können Sie angeben, wie viel Speicher im Heap für kleine und große Objekte benötigt wird.

Wenn nicht genügend Speicher vorhanden ist, gibt die Laufzeit den Wert „false“ zurück oder stoppt die Ausführung, bis durch die GC-Reinigung genügend Speicher verfügbar ist. Sie können dieses Verhalten steuern, indem Sie ein Flag an TryStartNoGCRegion übergeben. Wenn Sie erfolgreich einen GC-freien Bereich betreten (GC ist bis zum Ende des Prozesses nicht zulässig), muss am Ende des Prozesses die Methode EndNoGCRegion aufgerufen werden.

In der offiziellen Dokumentation wird nicht angegeben, ob diese Methode Thread-sicher ist. Angesichts des Funktionsprinzips von GC sollten Sie jedoch vermeiden, dass zwei Prozesse gleichzeitig versuchen, den GC-Status zu ändern.

Eine weitere Verbesserung des GC ist die Art und Weise, wie er mit angehefteten Objekten umgeht (d. h. Objekte, die nach der Zuweisung nicht verschoben werden können). Obwohl dieser Aspekt in der Dokumentation etwas vage beschrieben wird, werden beim Fixieren der Position eines Objekts normalerweise auch die Positionen der benachbarten Objekte fixiert. Rich Lander schrieb in dem Artikel:

Der GC verarbeitet angeheftete Objekte optimierter, sodass der GC den Speicher um die angehefteten Objekte effektiver komprimieren kann. Bei umfangreichen Anwendungen, die eine große Anzahl von Pins verwenden, wird diese Änderung die Leistung der Anwendung erheblich verbessern.

GC zeige auch eine bessere Intelligenz bei der Nutzung des Gedächtnisses in früheren Generationen, schrieb Rich weiter:

Die Art und Weise, wie Objekte der Generation 1 zu Objekten der Generation 2 hochgestuft werden, wurde ebenfalls verbessert, um den Speicher effizienter zu nutzen. Bevor einer Generation neuer Speicherplatz zugewiesen wird, versucht der GC zunächst, den verfügbaren Speicherplatz zu nutzen. Gleichzeitig wird beim Erstellen von Objekten unter Nutzung des verfügbaren Speicherplatzbereichs ein neuer Algorithmus verwendet, sodass die Größe des neu zugewiesenen Speicherplatzes näher an der Größe des Objekts liegt als zuvor.

Asynchroner lokaler Speicher

Die letzte Verbesserung steht nicht in direktem Zusammenhang mit der Leistung, kann aber dennoch durch effektive Nutzung Optimierungsergebnisse erzielen. In den Tagen, bevor asynchrone APIs populär wurden, konnten Entwickler Thread Local Storage (TLS) nutzen, um Informationen zwischenzuspeichern. TLS verhält sich wie ein globales Objekt für einen bestimmten Thread, was bedeutet, dass Sie direkt auf Kontextinformationen zugreifen und diese zwischenspeichern können, ohne explizit ein Kontextobjekt übergeben zu müssen.

Im Async/Warten-Modus wird der lokale Thread-Speicher unbrauchbar. Denn jedes Mal, wenn „await“ aufgerufen wird, ist es möglich, zu einem anderen Thread zu springen. Und selbst wenn es Ihnen gelingt, diese Situation zu vermeiden, könnte anderer Code zu Ihrem Thread springen und die Informationen in TLS stören.

Die neue Version von .NET führt den Asynchronous Local Storage (ALS)-Mechanismus ein, um dieses Problem zu lösen. ALS entspricht semantisch dem Thread-Local-Storage, kann jedoch mit dem Aufruf vonwait entsprechende Sprünge durchführen. Diese Funktion wird über die generische Klasse AsyncLocal implementiert, die intern das CallContext-Objekt aufruft, um Daten zu speichern.


Das obige ist der detaillierte Inhalt vonEin detaillierter Blick auf Leistungsverbesserungen in .NET. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
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

Java框架和.NET框架的性能差异Java框架和.NET框架的性能差异Jun 03, 2024 am 09:19 AM

在高并发请求处理方面,.NETASP.NETCoreWebAPI性能优于JavaSpringMVC,原因包括:AOT提前编译,减少启动时间;更精细的内存管理,由开发人员负责分配和释放对象内存。

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开发者,你必须意识到在交付高质量软件方面,优化功能和性能的重要性。通过熟练使用提供的资源并减少网站加载时间,你不仅为用户创造了愉快的体验,还能减少基础设施成本。

numpy版本更新解读:新特性与改进的性能numpy版本更新解读:新特性与改进的性能Jan 19, 2024 am 10:11 AM

随着数据科学和深度学习的不断发展,Python作为主流的编程语言之一,其科学计算库numpy也在不断推陈出新。最近,numpy发布了新的版本,其中包含了一些新特性和性能改进。在这篇文章中,我们将深入探讨numpy的新版本,介绍其中一些重要的特性和改进。shuffle函数改进在numpy1.17.0之前,shuffle函数会将数组元素按照随机顺序重新排序。然

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

VueRouterLazy-Loading路由的使用方法以及它对页面性能的改进效果随着前端应用的复杂度越来越高,前端路由的管理也变得愈加重要。Vue.js作为一款主流的前端框架,其内置的VueRouter提供了非常强大的路由管理功能,能够帮助我们构建灵活且高效的单页面应用。其中,VueRouterLazy-Loading是一项非常重要且实用的功能,

PHP8新特性示例:如何利用静态返回类型和代码提升性能?PHP8新特性示例:如何利用静态返回类型和代码提升性能?Sep 11, 2023 am 08:49 AM

PHP8是PHP语言的最新版本,带来了许多令人兴奋的新特性和改进。其中一项重要的新功能是静态返回类型。在本文中,我们将探讨如何利用静态返回类型和代码提升性能。静态返回类型是一种增强了类型安全性的特性,它允许我们在函数和方法的声明中指定返回值的类型。在PHP8之前,我们只能使用动态类型或标量类型来声明返回类型。使用静态返回类型,我们可以更精确地指定返回类型,从

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

SublimeText3 Linux neue Version

SublimeText3 Linux neue Version

SublimeText3 Linux neueste Version

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools