102 votes

Haut vs Bas de casse

Quand on fait de la casse, des comparaisons, est-il plus efficace pour convertir la chaîne en majuscules ou en minuscules? Est-il encore de l'importance?

Il est proposé dans ce post que le C# est plus efficace avec ToUpper parce que "Microsoft optimisé de cette façon." Mais j'ai aussi lu cet argument que la conversion de ToLower vs ToUpper dépend de ce que vos chaînes contiennent plus de, et que, généralement, les chaînes contiennent plus de caractères minuscules qui rend ToLower plus efficace.

En particulier, je voudrais savoir:

  • Est-il un moyen d'optimiser ToUpper ou ToLower tels que l'un est plus rapide que l'autre?
  • Est-il plus rapide de faire une comparaison sensible à la casse entre les majuscules et les minuscules cordes, et pourquoi?
  • Existe-il des environnements de programmation (par exemple. C, C#, Python, peu importe) où un cas est clairement mieux que les autres, et pourquoi?

100voto

Jon Skeet Points 692016

La conversion soit en majuscules ou en minuscules afin de faire de la casse, des comparaisons est inexacte en raison d'une "intéressant" les caractéristiques de certaines cultures, en particulier la Turquie. Au lieu de cela, utilisez un StringComparer avec les options appropriées.

MSDN a quelques grandes lignes directrices sur la manipulation des chaînes. Vous pourriez également vouloir vérifier que votre code passe la Turquie test.

EDIT: Remarque Neil commentaire autour de ordinale de la casse des comparaisons. L'ensemble de ce domaine est assez glauque :(

36voto

Ian Boyd Points 50743

À partir de Microsoft sur MSDN:

Les meilleures Pratiques pour l'Utilisation des Chaînes dans le .NET Framework

Recommandations pour l'Utilisation de la Chaîne

Pourquoi? À Partir De Microsoft:

Normaliser les chaînes de caractères en majuscules

Il ya un petit groupe de personnages que lorsqu'ils sont convertis en minuscules ne peut pas faire l'aller-retour.

20voto

Rob Walker Points 25840

Selon MSDN , il est plus efficace de passer dans les cordes et de dire la comparaison pour ignorer la casse:

Chaîne de caractères.Comparer(strA, ampb, StringComparsion.OrdinalIgnoreCase) est équivalent à (mais plus rapide que l'), l'appel d'

Chaîne de caractères.Comparer(ToUpperInvariant(strA), ToUpperInvariant(ampb), StringComparison.Ordinal).

Ces comparaisons sont encore très rapide.

Bien sûr, si vous comparez une chaîne de plus et plus de nouveau, cela ne peut pas tenir.

12voto

warren Points 12172

Basé sur les chaînes tendent à avoir plus d'entrées en minuscules, ToLower devrait théoriquement être plus rapide (beaucoup de comparaisons, mais quelques missions).

En C, ou lors de l'utilisation individuellement les éléments accessibles de chaque chaîne (comme les chaînes C ou de la STL type chaîne de caractères en C++), c'est en fait un octet de la comparaison, de sorte qu'en comparant UPPER n'est pas différent de lower.

Si vous avez été sournois et chargé de vos chaînes en long tableaux au lieu de cela, vous obtenez un très une comparaison rapide sur l'ensemble de la chaîne, car elle pourrait comparer 4 octets à la fois. Cependant, les temps de chargement peuvent faire qu'il ne vaut pas la peine.

Pourquoi avez-vous besoin de savoir qui est le plus rapide? Sauf si vous êtes en train de faire une métrique buttload de comparaisons, d'une exécution d'un couple de cycles plus rapide est sans influence sur la vitesse d'exécution global, et sonne comme l'optimisation prématurée :)

5voto

Dan Herbert Points 38336

Microsoft a optimisé ToUpperInvariant(), pas ToUpper(). La différence est que l'invariant est plus de la culture amicales. Si vous avez besoin de faire de la casse des comparaisons sur les chaînes de caractères qui peuvent varier dans la culture, l'utilisation de l'Invariant, sinon, les performances de l'invariant de conversion ne compte pas.

Je ne peux pas dire si ToUpper() ou ToLower() est plus rapide. Je n'ai jamais essayé car je n'ai jamais eu une situation où la performance importait beaucoup.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X