Integer- und Stringvergleich auf Systemebene

8

Wie werden ganze Zahlen und Zeichenketten auf niedrigem Niveau verglichen? Wie immer wenn wir

verwenden %Vor%

Und

%Vor%

Was ich jetzt frage ist, was ist der Systemlevelunterschied zwischen diesen beiden Vergleichen? Die Frage ist nicht für irgendeine bestimmte Sprache, es ist nur ein generisches Problem. Es geht auch nicht um die Umwandlung von Zeichenketten in Ganzzahl und umgekehrt. Ich weiß, dass die Antworten für verschiedene Plattformen und verschiedene Sprachen unterschiedlich sein können, aber da ich keine Ahnung habe, stelle ich nur eine generische Frage.

Und warum werden Integer-Vergleiche immer schneller als Zeichenkettenvergleiche betrachtet?

    
buch11 19.07.2011, 01:58
quelle

2 Antworten

12

Typischerweise wird die Zeichenkette oder ganze Zahl (in der einfachsten Form) byteweise verglichen.

Für das Beispiel von int wird das der Befehl für eine einzelne CPU:

%Vor%

Das läuft ziemlich schnell (unter der Annahme 32-Bit-Ints, 32-Bit oder besser Prozessor). Es ist ein einzelner Vergleich, der in CPU-Register passt.

Strings sind jedoch komplexer. Am einfachsten sieht es so aus:

%Vor%

und muss Zeichen für Zeichen die gesamte Zeichenfolge durchlaufen. Wenn die Strings unterschiedlich lang sind, muss es damit umgehen (natürlich haben beide die gleiche Größe).

Auf einer komplexeren Ebene, mit Gebietsschema und verschiedenen Zeichensätzen, kann jedes Zeichenkettenzeichen 2-4 Bytes sein und einige Zeichen (mit Akzenten und ähnlichem) können einander gleich sein, obwohl sie unterschiedliche Bytewerte haben. Es geht um viel mehr Handling und Verarbeitung, und mehr Arbeit bedeutet fast immer langsamer.

Das genaue Verhalten variiert je nach Gebietsschema, Zeichensatz und Sprache. Einige Sprachen (z. B. C #) speichern Strings mit einer Länge, während andere (C) einfach ein Array von Zeichen speichern. Andere Sprachen können für die Verarbeitung von Strings entwickelt werden oder sie haben optimierte Bibliotheken, um die Kosten zu senken.

Interessanterweise könnte das Vergleichen von Strings mit maximal 3 Zeichen bei der Arbeit mit ASCII-Strings theoretisch in etwa so schnell sein wie das Vergleichen von Ints. In diesem Fall hat es mehr mit der Speichermenge zu tun ( strcmp für ASCII kann memcmp intern verwenden, was ungefähr% ist, was == sowieso verwenden würde). Dies kann auch für Sprachen gelten, die die String-Länge am Anfang speichern, und für Zeichenfolgen mit der Länge 0 (leer), da sie einfach die Länge (die ein Int sein kann) vergleichen können.

    
ssube 19.07.2011, 02:05
quelle
2

Die ganzen Zahlen werden als ganzzahlige Werte gespeichert, die in binärer Form als eine einzelne Menge von 1 und Nullen dargestellt werden, die je nach Betriebssystem ein paar Bytes aufnehmen (

)

Die Zeichenfolgen werden als ein Zeichen pro Ziffer gespeichert, wobei jedes Zeichen ein Bitmuster in seinem Byte verwendet.

In Ihrem Beispiel nehmen die Strings etwa die doppelte Menge an Bytes ein, die im Vergleich zu den Ints dargestellt werden.

    
Randy 19.07.2011 02:05
quelle

Tags und Links