Maison >développement back-end >C++ >L'opérateur « as » offre-t-il toujours des avantages en termes de performances par rapport à « is » pour les types nullables en C# ?

L'opérateur « as » offre-t-il toujours des avantages en termes de performances par rapport à « is » pour les types nullables en C# ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-07 09:31:40240parcourir

Does the

Surprise de performances avec l'opérateur "as" et les types nullables

Dans le chapitre 4 de C# en profondeur, les types nullables et l'opérateur "as" sont abordés. Plus précisément, on s'attend à ce que l'utilisation de « as » pour la vérification de type puisse améliorer les performances par rapport aux vérifications et au casting « is » traditionnels, car cela simplifie le processus en une seule vérification de type et une seule vérification de valeur. Cependant, un résultat surprenant a été observé.

Test de référence des performances

Pour évaluer les performances, un test de référence a été effectué, qui impliquait la somme d'entiers dans un tableau d'objets comprenant de nombreuses références nulles et références de chaîne. . Le test a mesuré le temps d'exécution des extraits de code suivants :

  • Code de style C# 1 avec "is" et casting
  • Code utilisant le "en tant que" opérateur
  • LINQ solution

Au grand étonnement du chercheur, le code C# 1 a surpassé de loin le code "as" et le code LINQ.

Analyse des résultats

L'écart de performances est attribué aux facteurs suivants :

JIT Optimisation du compilateur pour "is" et Casting :
Le test de l'opérateur "is" et le casting ultérieur peuvent être optimisés par le compilateur JIT, ce qui donne lieu à un code machine très efficace qui s'exécute dans un nombre minimal d'instructions. Cette optimisation est possible car le type de valeur encadré peut être directement déballé dans une variable du même type sans aucune conversion ni copie de valeur.

Complexité de la conversion en Nullable :
 Casting en int ? l'utilisation de "as" nécessite un processus de conversion plus complexe car la représentation de la valeur de l'entier encadré diffère de la disposition de la mémoire de Nullable. Cela nécessite l'implication d'une fonction d'aide au déballage à usage général appelée JIT_Unbox_Nullable, qui introduit une surcharge supplémentaire en raison de sa nature générique et de sa vérification de type.

Comportement inattendu de LINQ :
Le OfType () dans LINQ utilise également l'opérateur "is" et la fonction d'assistance JIT_Unbox(). Cependant, ses performances étaient comparables à celles de la distribution "as" sur Nullable, malgré l'espoir qu'il soit moins cher. Cet écart peut être attribué à des problèmes potentiels causés par ngen.exe.

Conclusion

Bien que l'opérateur "as" fournisse un moyen pratique d'effectuer une vérification de type et une gestion des valeurs nullables, ses caractéristiques de performances sous des scénarios spécifiques peuvent ne pas toujours se dérouler comme prévu. Le code optimisé généré pour "is" et le casting en C# 1 reste nettement plus rapide dans les cas impliquant de nombreuses opérations de unboxing, soulignant l'importance de prendre en compte les implications en termes de performances lors de la sélection des techniques de codage.

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:
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