Maison développement back-end Tutoriel C#.Net Un aperçu détaillé des améliorations de performances dans .NET

Un aperçu détaillé des améliorations de performances dans .NET

Mar 09, 2017 pm 03:41 PM

.NET 4.6 apporte certaines fonctionnalités CLR liées à l'amélioration des performances. Certaines de ces fonctionnalités prendront effet automatiquement, tandis que d'autres, telles que SIMD et Async Local Storage, nécessitent des modifications dans la façon dont les applications sont écrites.

SIMD

L'équipe Mono a toujours été fière de prendre en charge SIMD, la fonctionnalité de flux de données multiples à flux d'instruction unique. SIMD est un jeu d'instructions CPU capable d'effectuer la même opération sur jusqu'à 8 valeurs en même temps. Avec le lancement de .NET CLR version 4.6, les développeurs Windows peuvent enfin utiliser cette fonctionnalité.

Afin d'observer réellement l'effet du SIMD, vous pouvez vous référer à cet exemple. Supposons que vous deviez ajouter deux tableaux sous la forme c[i] = a[i] b[i] pour obtenir un troisième tableau. En utilisant SIMD, vous pouvez écrire du code de la manière suivante :

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

Notez comment cette boucle s'incrémente de la valeur de Vector.Count, qui peut être 4 ou 8 selon le type de CPU. Le compilateur .NET JIT générera le code correspondant pour ajouter par lots les tableaux avec une valeur de 4 ou 8 selon le processeur.

Cette méthode semble un peu lourde, c'est pourquoi Microsoft propose également une série de classes auxiliaires, notamment :

  • Structure Matrice3x2

  • Structure Matrix4x4

  • Structure plane

  • Structure quaternion

  • Classe de vecteur

  • Structure du vecteur (T)

  • Structure Vecteur2

  • Structure Vector3

  • Structure Vector4

Désinstallation de l'assemblage

Je crains que la plupart des développeurs ne le sachent pas : .NET charge souvent deux fois le même assembly. La condition pour que cela se produise est que .NET charge d'abord la version IL d'un assembly, puis charge la version NGEN (c'est-à-dire la version précompilée) du même assembly. Cette approche constitue un sérieux gaspillage de mémoire physique, en particulier pour les grandes applications 32 bits telles que Visual Studio.

Dans .NET 4.6, une fois que le CLR charge la version NGEN d'un assembly, il effacera automatiquement la mémoire occupée par la version IL correspondante.

Collecte des déchets

Plus tôt, nous avons discuté du mode de latence du garbage collection introduit dans .NET 4.0. Bien que cette méthode soit beaucoup plus fiable que de laisser le GC s'arrêter complètement pendant un certain temps, elle n'est toujours pas suffisante pour terminer de nombreux scénarios de GC.

Dans .NET 4.6, vous pourrez suspendre temporairement le garbage collector de manière plus sophistiquée. La nouvelle méthode TryStartNoGCRegion vous permet de spécifier la quantité de mémoire nécessaire dans le tas pour les petits objets et les gros objets.

Si la mémoire est insuffisante, le moteur d'exécution renvoie false ou s'arrête jusqu'à ce que suffisamment de mémoire soit obtenue via le nettoyage du GC. Vous pouvez contrôler ce comportement en transmettant un indicateur à TryStartNoGCRegion. Si vous entrez avec succès dans une zone sans GC (le GC n'est pas autorisé avant la fin du processus), la méthode EndNoGCRegion doit être appelée à la fin du processus.

La documentation officielle n'indique pas si cette méthode est thread-safe, mais compte tenu du principe de fonctionnement de GC, vous devriez essayer d'éviter que deux processus tentent de modifier l'état du GC en même temps.

Une autre amélioration apportée au GC réside dans la façon dont il gère les objets épinglés (c'est-à-dire les objets qui ne peuvent pas être déplacés une fois alloués). Bien que cet aspect soit décrit de manière quelque peu vague dans la documentation, lorsque vous fixez la position d'un objet, cela corrige généralement également la position des objets adjacents. Rich Lander a écrit dans l'article :

Le GC gérera les objets épinglés de manière plus optimisée, afin qu'il puisse compresser plus efficacement la mémoire autour des objets épinglés. Pour les applications à grande échelle utilisant un grand nombre de broches, ce changement améliorera considérablement les performances de l'application.

GC fait également preuve d'une meilleure intelligence dans la façon d'utiliser la mémoire dans les générations précédentes. Rich a continué à écrire :

.

La façon dont les objets de génération 1 sont promus en objets de génération 2 a également été améliorée pour utiliser la mémoire plus efficacement. Avant d'allouer un nouvel espace mémoire pour une génération, le GC essaiera d'abord d'utiliser l'espace disponible. Dans le même temps, un nouvel algorithme est utilisé lors de la création d'objets en utilisant l'espace disponible, de sorte que la taille de l'espace nouvellement alloué soit plus proche de la taille de l'objet qu'auparavant.

Stockage local asynchrone

La dernière amélioration n'est pas directement liée aux performances, mais elle permet toujours d'obtenir des résultats d'optimisation grâce à une utilisation efficace. Avant que les API asynchrones ne deviennent populaires, les développeurs pouvaient exploiter le stockage local par thread (TLS) pour mettre en cache les informations. TLS agit comme un objet global pour un thread spécifique, ce qui signifie que vous pouvez accéder directement aux informations contextuelles et les mettre en cache sans avoir à transmettre explicitement un objet contextuel.

En mode asynchrone/attente, le stockage local des threads devient inutile. Parce que chaque fois que wait est appelé, il est possible de passer à un autre thread. Et même si vous parvenez à éviter cette situation, d'autres codes peuvent accéder à votre fil de discussion et interférer avec les informations contenues dans TLS.

La nouvelle version de .NET introduit le mécanisme de stockage local asynchrone (ALS) pour résoudre ce problème. ALS est sémantiquement équivalent au stockage local de thread, mais il peut effectuer les sauts correspondants avec l'appel de wait. Cette fonction sera implémentée via la classe générique AsyncLocal, qui appellera en interne l'objet CallContext pour sauvegarder les données.


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Partagez plusieurs frameworks de projets open source .NET liés à l'IA et au LLM Partagez plusieurs frameworks de projets open source .NET liés à l'IA et au LLM May 06, 2024 pm 04:43 PM

Le développement des technologies d’intelligence artificielle (IA) bat son plein aujourd’hui et elles ont montré un grand potentiel et une grande influence dans divers domaines. Aujourd'hui, Dayao partagera avec vous 4 cadres de projets liés au modèle d'IA open source .NET LLM, dans l'espoir de vous fournir une référence. https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel est un kit de développement logiciel (SDK) open source conçu pour intégrer de grands modèles de langage (LLM) tels qu'OpenAI, Azure

Quelles sont les perspectives d'emploi du C# ? Quelles sont les perspectives d'emploi du C# ? Oct 19, 2023 am 11:02 AM

Que vous soyez débutant ou professionnel expérimenté, la maîtrise du C# ouvrira la voie à votre carrière.

Quels sont les améliorations de performances et les avantages de PHP8 ? Quels sont les améliorations de performances et les avantages de PHP8 ? Jan 13, 2024 pm 12:24 PM

Quels sont les améliorations de performances et les avantages apportés par PHP8 ? Depuis sa création en 1995, PHP est l'un des langages de script côté serveur les plus populaires. PHP8 est la dernière version de PHP, qui sera officiellement publiée fin 2020. PHP8 apporte de nombreuses nouvelles fonctionnalités et améliorations intéressantes, notamment en termes de performances. Cet article présentera certaines des principales améliorations de performances et avantages de PHP8 et fournira des exemples de code spécifiques. Compilateur JIT PHP8 introduit le compilateur JIT (Just-In-Time), qui est un

Technologie d'optimisation des performances .NET pour les développeurs Technologie d'optimisation des performances .NET pour les développeurs Sep 12, 2023 am 10:43 AM

Si vous êtes un développeur .NET, vous devez être conscient de l'importance d'optimiser les fonctionnalités et les performances pour fournir des logiciels de haute qualité. En utilisant de manière experte les ressources fournies et en réduisant les temps de chargement des sites Web, vous créez non seulement une expérience agréable pour vos utilisateurs, mais vous réduisez également les coûts d'infrastructure.

Différences de performances entre le framework Java et le framework .NET Différences de performances entre le framework Java et le framework .NET Jun 03, 2024 am 09:19 AM

En termes de traitement des requêtes à haute concurrence, .NETASP.NETCoreWebAPI fonctionne mieux que JavaSpringMVC. Les raisons incluent : la compilation précoce AOT, qui réduit le temps de démarrage, une gestion plus raffinée de la mémoire, où les développeurs sont responsables de l'allocation et de la libération de la mémoire des objets.

Interprétation des mises à jour de version numpy : nouvelles fonctionnalités et performances améliorées Interprétation des mises à jour de version numpy : nouvelles fonctionnalités et performances améliorées Jan 19, 2024 am 10:11 AM

Avec le développement continu de la science des données et de l'apprentissage profond, Python est l'un des langages de programmation les plus répandus, et sa bibliothèque de calcul scientifique numpy innove également constamment. Récemment, numpy a publié une nouvelle version contenant de nouvelles fonctionnalités et des améliorations de performances. Dans cet article, nous allons approfondir la nouvelle version de numpy et présenter certaines de ses fonctionnalités et améliorations importantes. Amélioration de la fonction Shuffle Avant numpy1.17.0, la fonction shuffle réorganisait les éléments du tableau dans un ordre aléatoire. Couru

Comment utiliser le routage Lazy-Loading de Vue Router et son effet sur l'amélioration des performances des pages Comment utiliser le routage Lazy-Loading de Vue Router et son effet sur l'amélioration des performances des pages Sep 15, 2023 pm 02:10 PM

Comment utiliser le routage VueRouterLazy-Loading et son effet sur l'amélioration des performances des pages À mesure que les applications frontales deviennent de plus en plus complexes, la gestion du routage front-end est devenue de plus en plus importante. En tant que framework frontal grand public, VueRouter intégré à Vue.js fournit des fonctions de gestion de routage très puissantes, qui peuvent nous aider à créer des applications d'une seule page flexibles et efficaces. Parmi eux, VueRouterLazy-Loading est une fonction très importante et pratique.

Tutoriel avancé C # .NET: Ace votre prochain entretien de développeur senior Tutoriel avancé C # .NET: Ace votre prochain entretien de développeur senior Apr 08, 2025 am 12:06 AM

L'entrevue avec C # Developer Senior Developer nécessite de maîtriser les connaissances de base telles que la programmation asynchrone, la LINQ et les principes de travail internes des frameworks .NET. 1. La programmation asynchrone simplifie les opérations par asynchronisation et attend pour améliorer la réactivité de l'application. 2.Linq exploite des données dans le style SQL et fait attention aux performances. 3. La CLR du cadre net gère la mémoire et la collecte des ordures doit être utilisée avec prudence.

See all articles