Ist es bei Vergleichen ohne Berücksichtigung der Groß- und Kleinschreibung effizienter, die Zeichenfolge in Groß- oder Kleinschreibung umzuwandeln? Ist es überhaupt wichtig?
In diesem SO-Beitrag wird vorgeschlagen, dass C # mit ToUpper effizienter ist, weil "Microsoft es auf diese Weise optimiert hat". Ich habe aber auch dieses Argument gelesen , dass das Konvertieren von ToLower vs. ToUpper davon abhängt, wovon Ihre Zeichenfolgen mehr enthalten, und dass Zeichenfolgen normalerweise mehr Kleinbuchstaben enthalten, was ToLower effizienter macht.
Insbesondere würde ich gerne wissen:
- Gibt es eine Möglichkeit, ToUpper oder ToLower so zu optimieren, dass einer schneller als der andere ist?
- Ist es schneller, einen Vergleich zwischen Groß- und Kleinschreibung ohne Berücksichtigung der Groß- und Kleinschreibung durchzuführen, und warum?
- Gibt es Programmierumgebungen (z. B. C, C #, Python usw.), in denen ein Fall eindeutig besser ist als der andere, und warum?
quelle
Von Microsoft auf MSDN:
Warum? Von Microsoft :
Was ist ein Beispiel für einen solchen Charakter, der keine Rundreise machen kann?
.NET Geige
Wenn Sie Vergleiche ohne Berücksichtigung der Groß- und Kleinschreibung durchführen möchten, konvertieren Sie die Zeichenfolgen daher in Großbuchstaben und nicht in Kleinbuchstaben.
Wenn Sie also einen auswählen müssen, wählen Sie Großbuchstaben .
quelle
i
auf Türkisch erraten , wann sie werdenİ
, und nicht dieI
, an die Sie gewöhnt sind. Wir sind es auch gewohnt, in Großbuchstaben zuI
schreibeni
, aber in der Türkei wird esı
.Laut MSDN ist es effizienter, die Zeichenfolgen zu übergeben und den Vergleich anzuweisen, Groß- und Kleinschreibung zu ignorieren:
Wenn Sie eine Zeichenfolge immer wieder vergleichen, gilt dies möglicherweise nicht.
quelle
Basierend auf Zeichenfolgen, die tendenziell mehr Einträge in Kleinbuchstaben enthalten, sollte ToLower theoretisch schneller sein (viele Vergleiche, aber nur wenige Zuweisungen).
In C oder wenn einzeln zugängliche Elemente jeder Zeichenfolge verwendet werden (z. B. C-Zeichenfolgen oder der Zeichenfolgentyp der STL in C ++), handelt es sich tatsächlich um einen Byte-Vergleich. Der Vergleich unterscheidet sich
UPPER
also nicht vonlower
.Wenn Sie hinterhältig waren und Ihre Saiten in geladen haben
long
stattdessen Arrays würden, würden Sie einen sehr schnellen Vergleich für die gesamte Zeichenfolge erhalten, da 4 Bytes gleichzeitig verglichen werden könnten. Aufgrund der Ladezeit lohnt es sich jedoch möglicherweise nicht.Warum müssen Sie wissen, was schneller ist? Wenn Sie nicht eine ganze Reihe von Vergleichen durchführen, ist eine, die ein paar Zyklen schneller ausgeführt wird, für die Geschwindigkeit der Gesamtausführung irrelevant und klingt nach vorzeitiger Optimierung :)
quelle
s
undt
in Arrays von Longs konvertieren möchten, sodass die Zeichenfolgen gleich sind, wenn die Arrays gleich sind, müssen Sie s und t nach unten gehen, bis Sie das abschließende'\0'
Zeichen gefunden haben (oder Sie können den Müll nach dem Ende der Zeichenfolgen vergleichen). Dies kann ein unzulässiger Speicherzugriff sein, der undefiniertes Verhalten hervorruft. Aber warum nicht einfach die Vergleiche anstellen, während Sie nacheinander über die Charaktere gehen? Mit C ++ - Zeichenfolgen können Sie wahrscheinlich die Länge.c_str()
abrufenlong *
und ein Präfix der Länge in a umwandeln und vergleichen.size() - .size()%(sizeof long)
. Sieht für mich ein bisschen faul aus.Microsoft hat optimiert
ToUpperInvariant()
, nichtToUpper()
. Der Unterschied ist, dass Invariante kulturfreundlicher ist. Wenn Sie Vergleiche zwischen Zeichenfolgen, die in der Kultur variieren können, ohne Berücksichtigung der Groß- und Kleinschreibung durchführen müssen, verwenden Sie Invariant. Andernfalls sollte die Leistung der invarianten Konvertierung keine Rolle spielen.Ich kann nicht sagen, ob ToUpper () oder ToLower () schneller ist. Ich habe es nie versucht, da ich noch nie eine Situation hatte, in der Leistung so wichtig war.
quelle
Wenn Sie einen Zeichenfolgenvergleich in C # durchführen, ist die Verwendung von .Equals () erheblich schneller, anstatt beide Zeichenfolgen in Groß- oder Kleinschreibung zu konvertieren. Ein weiteres großes Plus bei der Verwendung von .Equals () ist, dass nicht mehr Speicher für die 2 neuen Groß- / Kleinbuchstaben zugewiesen wird.
quelle
Es sollte wirklich nie wichtig sein. Bei ASCII-Zeichen spielt das definitiv keine Rolle - es sind nur ein paar Vergleiche und ein bisschen Flip für beide Richtungen. Unicode ist möglicherweise etwas komplizierter, da es einige Zeichen gibt, die die Groß- und Kleinschreibung auf seltsame Weise ändern, aber es sollte wirklich keinen Unterschied geben, es sei denn, Ihr Text ist voll mit diesen Sonderzeichen.
quelle
Wenn Sie es richtig machen, sollte es einen kleinen, unbedeutenden Geschwindigkeitsvorteil geben, wenn Sie in Kleinbuchstaben konvertieren. Dies ist jedoch, wie viele angedeutet haben, kulturabhängig und erbt nicht in der Funktion, sondern in den von Ihnen konvertierten Zeichenfolgen (viele Kleinbuchstaben) bedeutet nur wenige Zuweisungen zum Speicher) - die Konvertierung in Großbuchstaben ist schneller, wenn Sie eine Zeichenfolge mit vielen Großbuchstaben haben.
quelle
Es hängt davon ab, ob. Wie oben angegeben, nur ASCII, es ist identisch. Lesen und verwenden Sie in .NET String.Compare für das i18n- Material (Sprachkulturen und Unicode). Wenn Sie etwas über die Wahrscheinlichkeit der Eingabe wissen, verwenden Sie den allgemeineren Fall.
Denken Sie daran, wenn Sie mehrere Zeichenfolgen vergleichen, ist die Länge ein ausgezeichneter erster Diskriminator.
quelle
Wenn Sie es mit reinem ASCII zu tun haben, spielt es keine Rolle. Es ist nur ein ODER x, 32 gegen ein UND x, 224. Unicode, ich habe keine Ahnung ...
quelle