Maison >développement back-end >C++ >Pourquoi l'opérateur C# « as » est-il plus lent que « is » avec les types nullables ?
Différences de performances inattendues avec l'opérateur "as" et les types nullables en C#
L'opérateur "as" en C# offre un moyen pratique d'effectuer tapez des vérifications et des conversions dynamiques. Bien qu'il puisse sembler que l'utilisation de "as" avec des types nullables offrirait des améliorations de performances par rapport à l'opérateur et au casting "is" traditionnels, des tests récents ont révélé des résultats surprenants.
Dans un scénario de test dans lequel un tableau d'objets contient un mélange d'entiers, de chaînes et de références nulles, l'opérateur "as" est nettement sous-performant par rapport à l'opérateur "is". C'était inattendu, car on pourrait supposer que la combinaison de la vérification de type et de la vérification de valeur par l'opérateur "as" serait plus efficace que d'interroger deux fois les types dynamiques.
L'analyse de l'implémentation .NET de "isinst" pour les types nullables révèle qu'il n'est pas particulièrement lent. Au lieu de cela, le problème semble provenir de l'étape de déballage supplémentaire requise lors de l'utilisation de "as" avec des types nullables.
Le compilateur JIT peut générer du code hautement optimisé pour l'opérateur "is" et lancer des types non nullables. Cependant, "as" avec les types nullables nécessite une fonction d'assistance JIT plus complexe pour effectuer le déballage et la conversion en Nullable
La solution LINQ, qui utilise "OfType()" et une conversion en un type générique, fonctionne également moins bien que l'opérateur "est". Cela pourrait être attribué à la fonction d'assistance JIT, JIT_Unbox(), qui est appelée lors de la conversion en Nullable
En conclusion, bien que l'opérateur "as" fournisse une syntaxe pratique, il se peut qu'il ne soit pas toujours offrent les meilleures performances lorsque vous travaillez avec des types nullables. Dans les scénarios critiques en termes de performances, il est conseillé d'utiliser l'opérateur "is" et un cast directement vers le type souhaité.
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!