Intern, string::operator==()
verwendet string::compare()
. Bitte beachten Sie: CPlusPlus - string::operator==()
Ich habe eine kleine Anwendung geschrieben, um die Leistung zu vergleichen, und anscheinend, wenn Sie kompilieren und führen Sie Ihren Code auf Debug-Umgebung die string::compare()
ist etwas schneller als string::operator==()
. Wenn Sie Ihren Code jedoch in der Release-Umgebung kompilieren und ausführen, sind beide ziemlich gleich.
Zu Ihrer Information: Ich habe 1.000.000 Iterationen durchgeführt, um zu einer solchen Schlussfolgerung zu kommen.
Um zu beweisen, warum in der Debug-Umgebung der string::compare schneller ist, ging ich zur Assembly und hier ist der Code:
DEBUG BUILD
string::operator==()
if (str1 == str2)
00D42A34 lea eax,[str2]
00D42A37 push eax
00D42A38 lea ecx,[str1]
00D42A3B push ecx
00D42A3C call std::operator==<char,std::char_traits<char>,std::allocator<char> > (0D23EECh)
00D42A41 add esp,8
00D42A44 movzx edx,al
00D42A47 test edx,edx
00D42A49 je Algorithm::PerformanceTest::stringComparison_usingEqualOperator1+0C4h (0D42A54h)
string::compare()
if (str1.compare(str2) == 0)
00D424D4 lea eax,[str2]
00D424D7 push eax
00D424D8 lea ecx,[str1]
00D424DB call std::basic_string<char,std::char_traits<char>,std::allocator<char> >::compare (0D23582h)
00D424E0 test eax,eax
00D424E2 jne Algorithm::PerformanceTest::stringComparison_usingCompare1+0BDh (0D424EDh)
Sie können sehen, dass in string::operator==() zusätzliche Operationen durchgeführt werden müssen (add esp, 8 und movzx edx,al)
FREIGABE GEBÄUDE
string::operator==()
if (str1 == str2)
008533F0 cmp dword ptr [ebp-14h],10h
008533F4 lea eax,[str2]
008533F7 push dword ptr [ebp-18h]
008533FA cmovae eax,dword ptr [str2]
008533FE push eax
008533FF push dword ptr [ebp-30h]
00853402 push ecx
00853403 lea ecx,[str1]
00853406 call std::basic_string<char,std::char_traits<char>,std::allocator<char> >::compare (0853B80h)
string::compare()
if (str1.compare(str2) == 0)
00853830 cmp dword ptr [ebp-14h],10h
00853834 lea eax,[str2]
00853837 push dword ptr [ebp-18h]
0085383A cmovae eax,dword ptr [str2]
0085383E push eax
0085383F push dword ptr [ebp-30h]
00853842 push ecx
00853843 lea ecx,[str1]
00853846 call std::basic_string<char,std::char_traits<char>,std::allocator<char> >::compare (0853B80h)
Beide Assemblercodes sind sich sehr ähnlich, da der Compiler eine Optimierung durchführt.
Meiner Meinung nach ist der Leistungsgewinn vernachlässigbar, daher würde ich es dem Entwickler überlassen, zu entscheiden, welche Variante er bevorzugt, da beide das gleiche Ergebnis erzielen (vor allem, wenn es sich um ein Release-Build handelt).
10 Stimmen
Die erste gibt true zurück, während die zweite false zurückgibt, und umgekehrt.
91 Stimmen
Der erste ist kaum lesbar, während der zweite leicht zu lesen und zu verstehen ist.
8 Stimmen
Ich verwende "Vergleichsfunktionen" wie diese:
if(x.compare(y) == 0)
<- Gleichheitszeichen, es ist gleich. IMO verwenden!
dient nur dazu, den Code unlesbar zu machen.4 Stimmen
Es ist zu beachten, dass == nicht in jedem Fall funktioniert. string überlädt den Operator, um einen Vergleich durchzuführen, also ist == dasselbe wie der Aufruf eines Vergleichs. Wenn Sie dies mit Objekten versuchen, die den ==-Operator nicht überladen, vergleichen Sie deren Adresse im Speicher und nicht deren interne Komponenten. Der Aufruf von compare ist "sicherer". Im Falle der Verwendung von std::string ist dies jedoch kein Problem.
2 Stimmen
Ein Unterschied:
compare
return-1
sis
niedriger ist alst
y+1
sis
größer ist alst
während==
returntrue/false
. Ganze Zahlen ungleich Null sindtrue
y0
estfalse
.0 Stimmen
Die zweite ist durch einen Kompressionsalgorithmus besser komprimierbar, da das Programm mehr == haben könnte.