Haut vs Bas de casse
Lors 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 suggéré 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?
Vous devez vous connecter pour publier un commentaire.
De 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 de 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 🙁
Dictionary<string, ...>
avec quelque chose commeStringComparer.OrdinalIgnoreCase
. Vous avez seulement besoin d'être en mesure de tester pour la casse de l'égalité, et de se faire une bonne code de hachage qui est cohérent avec ce que.Hash
cas de la version neutre (c'est à dire les majuscules)Dictionary<string, ...>
etStringComparer
, car ceux-ci sont dans une langue différente de la langue que j'ai, ou le posteur d'origine, sont en train de parler. Si vous étiez à la mise en œuvre d'une table de hachage, dans l'assemblée, quel algorithme utiliser pour créer de la casse, des codes de hachage? Si vous avez été de choisir entre uppercasing et la mise en minuscules, la réponse correcte est uppercasing.De Microsoft sur MSDN:
Pourquoi? De Microsoft:
Qu'est-ce que l'exemple d'un tel caractère qui ne peut pas faire l'aller-retour?
C'est pourquoi, si vous voulez faire de la casse des comparaisons de convertir les chaînes de caractères en majuscule, et non en minuscule.
i
en turc, quand devientİ
, plutôt que de laI
que vous en avez l'habitude. Aussi, nous avons l'habitude de majusculesI
deveniri
, mais en Turquie il devientı
.ToUpper()
il va se transformer en " SS " sur de nombreux systèmes. Donc c'est effectivement pas un aller-retour-mesure que ce soit.ToUpperInvariant()
, de sorte qu'il serait toujours agréable de voir des exemples concrets pourquoi la majuscule est mieux que de minusculesSelon MSDN il est plus efficace de passer dans les cordes et de dire la comparaison pour ignorer la casse:
Bien sûr, si vous comparez une chaîne de plus et plus de nouveau, cela ne peut pas tenir.
Basées sur des 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 delower
.Si vous étiez sournois et chargé de vos chaînes en
long
des 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 🙂
s
ett
à des tableaux de longs tels que les chaînes de caractères sont égaux ssi les tableaux sont à égalité, vous avez à marcher vers le bas s et t jusqu'à ce que vous trouver la résiliation de'\0'
personnage (ou d'autre, vous pouvez comparer les ordures delà de la fin des chaînes de caractères, qui peut être illégale d'un accès à la mémoire qui invoque un comportement indéfini). Mais pourquoi alors ne pas faire de comparaisons tout en marchant sur les caractères un par un? Avec les chaînes C++, vous pouvez probablement obtenir la longueur et.c_str()
, fonte à unlong *
et de comparer un préfixe de longueur.size() - .size()%(sizeof long)
. L'air un peu louche pour moi, tho.Microsoft a optimisé
ToUpperInvariant()
, pasToUpper()
. 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 que. Je n'ai jamais essayé car je n'ai jamais eu une situation où la performance importait beaucoup.
Si vous faites de la comparaison de chaînes de caractères en C#, il est nettement plus rapide à utiliser .Equals() au lieu de convertir les deux chaînes de caractères en majuscules ou en minuscules. Un autre gros plus pour l'aide .Equals (), c'est que plus de la mémoire n'est pas alloué pour les 2 nouveaux majuscules/minuscules cordes.
Il ne devrais vraiment pas d'importance. Avec des caractères ASCII, il n'a certainement pas d'importance - il est juste un peu de comparaisons et d'une inversion de bits pour l'une ou l'autre direction. Unicode peut-être un peu plus compliqué, car il y a certains personnages qui changent de cas étranges façons, mais il y a vraiment ne devrait pas y avoir de différence, sauf si votre texte est plein de ces caractères spéciaux.
Faire droite, il devrait y avoir un petit, insignifiant avantage de vitesse si vous le convertir en minuscules, mais ce n'est, comme beaucoup, a laissé entendre, de la culture dépendante et n'est pas hériter de la fonction, mais dans les chaînes de vous convertir (beaucoup de lettres minuscules, peu de ces affectations de mémoire) -- la conversion en majuscules est plus rapide si vous avez une chaîne de caractères avec beaucoup de majuscules.
Il Dépend.
Comme indiqué ci-dessus, plaine uniquement des caractères ASCII, son identique.
Dans .NET, lire et utiliser Chaîne de caractères.Comparer son correct pour l'i18n trucs (langues, cultures et unicode). Si vous savez quelque chose à propos de la probabilité de l'entrée, utilisez le cas le plus fréquent.
Rappelez-vous, si vous faites plusieurs comparaisons de chaînes de longueur est une excellente première discriminateur.
Si vous avez affaire dans le plus pur ASCII, il n'a pas d'importance. C'est juste un OU x,32 vs un ET x,224. Unicode, je n'ai aucune idée...