2008-11-15 7 views
3

Qu'est-ce qui est le plus rapide? Ce:C# performance: comparaison de type vs comparaison de chaînes

bool isEqual = (MyObject1 is MyObject2) 

Ou ceci:

bool isEqual = ("blah" == "blah1") 

Il serait utile de savoir que l'on est plus rapide. De toute évidence, si vous appliquez .ToUpper() à chaque côté de la comparaison de chaînes comme le font souvent les programmeurs, cela nécessiterait de réallouer de la mémoire qui affecte les performances. Mais que diriez-vous si .ToUpper() est hors de l'équation comme dans l'exemple ci-dessus?

Répondre

4

Le premier est utilisé pour comparer des types et non des valeurs. Si vous voulez comparer des chaînes avec un cas non sensible, vous pouvez utiliser:


     string toto = "toto"; 
     string tata = "tata"; 
     bool isEqual = string.Compare(toto, tata, StringComparison.InvariantCultureIgnoreCase) == 0;  
     Console.WriteLine(isEqual);  
5

Selon le livre Maximisation des performances .NET l'appel

bool isEqual = String.Equals("test", "test"); 

est identique à la performance

bool isEqual = ("test" == "test"); 

L'appel

bool isEqual = "test".Equals("test"); 

est théoriquement plus lent que l'appel à la méthode statique String.Equals, mais je pense que vous aurez besoin de comparer plusieurs millions de chaînes afin de détecter réellement une différence de vitesse.

Mon conseil pour vous est le suivant: ne vous inquiétez pas de savoir quelle méthode de comparaison de chaînes est la plus lente ou la plus rapide. Dans une application normale, vous ne remarquerez jamais la différence. Vous devriez utiliser la manière que vous pensez être la plus lisible.

+0

Est-ce que Nicholas J. Wienholt est l'auteur? Considérez-vous cela comme une lecture recommandée? – JSWork

0

Comparaison de chaînes avec un opérateur « == » compare les contenu de la chaîne par rapport à l'objet chaîne référence. La comparaison d'objets appelle la méthode "Equals" de l'objet pour déterminer s'ils sont égaux ou non. L'implémentation par défaut de Equals consiste à faire une comparaison de référence, renvoyant True si les deux références d'objet sont même objet physique. Cela sera probablement plus rapide que la comparaison de chaînes, mais dépend du type d'objet comparé.

9

Je suis un peu confus ici.

Comme d'autres réponses l'ont noté, vous comparez des pommes et des oranges. ::rimshot::

Si vous souhaitez déterminer si un objet est d'un certain type, utilisez l'opérateur is. Si vous voulez comparer des chaînes, utilisez l'opérateur == (ou toute autre méthode de comparaison appropriée si vous avez besoin de quelque chose de plus sophistiqué comme des comparaisons insensibles à la casse).

La rapidité avec laquelle une opération est comparée à l'autre (sans jeu de mots) ne semble pas vraiment importante.


Après lecture plus attentive, je pense que vous voulez comparer la vitesse de comparisions de chaîne avec la vitesse des comparaisons de référence (le type de comparaison utilisé dans le type de base System.Object).

Si tel est le cas, alors la réponse est que les comparaisons de référence ne seront jamais plus lentes que toute autre comparaison de chaîne. La comparaison de références dans .NET est à peu près analogue à la comparaison de pointeurs en C - à propos de aussi vite que vous pouvez l'obtenir.

Cependant, comment vous sentiriez-vous si une variable chaîne s avait la valeur "I'm a string", mais la comparaison suivante a échoué:

if (((object) s) == ((object) "I'm a string")) { ... } 

Si vous simplement des références compariez, qui pourraient se produire en fonction de la façon dont la valeur de s était créé. S'il ne finissait pas par être interné, il n'aurait pas la même référence que la chaîne littérale, donc la comparaison échouerait. Vous pourriez donc avoir une comparaison plus rapide qui n'a pas toujours fonctionné. Cela semble être une mauvaise optimisation.

+3

Les autres réponses ont manqué le point clé, qui est que l'opérateur "est" ne fait rien comme ce que le questionneur pense faire. –

0

je suppose que la comparaison des objets dans votre premier exemple va être à peu près aussi vite qu'il obtient depuis sa simple vérification si les deux objets pointent à la même adresse en mémoire.

Comme cela a déjà été mentionné plusieurs fois, il est également possible de comparer des adresses sur des chaînes, mais cela ne fonctionnera pas nécessairement si les deux chaînes sont attribuées à partir de sources différentes. Enfin, c'est généralement une bonne forme pour essayer de comparer les objets en fonction du type, dans la mesure du possible. C'est généralement la méthode d'identification la plus concrète. Si vos objets doivent être représentés par quelque chose d'autre que leur adresse en mémoire, il est possible d'utiliser d'autres attributs comme identifiants.

+0

Vous avez également manqué la signification de l'opérateur "is", je pense? –

0

Si je comprends la question et vous vraiment voulez comparer l'égalité de référence avec la plaine ancienne « comparer le contenu »: Construire un testcase et appeler object.ReferenceEquals comparé à un == b.

Remarque: Vous avez pour comprendre quelle est la différence et que vous ne pouvez probablement pas utiliser une comparaison de référence dans la plupart des scénarios. Si vous êtes sûr que c'est ce que vous voulez pourrait être un peu plus rapide. Vous devez l'essayer vous-même et évaluer si cela en vaut la peine.