Dahili string::operator==()
olarak kullanıyor string::compare()
. Lütfen bakınız: CPlusPlus -string::operator==()
Performansı karşılaştırmak için küçük bir uygulama yazdım ve görünüşe göre kodunuzu hata ayıklama ortamında derleyip çalıştırdığınızda string::compare()
biraz daha hızlı string::operator==()
. Ancak kodunuzu Release ortamında derleyip çalıştırırsanız, her ikisi de hemen hemen aynıdır.
FYI, böyle bir sonuç çıkarmak için 1.000.000 yineleme yaptım.
Hata ayıklama ortamında string :: Compare'in neden daha hızlı olduğunu kanıtlamak için derlemeye gittim ve işte kod:
HATA AYIKLAMA BİNASI
dize :: operatörü == ()
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)
dize :: karşılaştırma ()
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)
String :: operator == () içinde ekstra işlemler yapması gerektiğini görebilirsiniz (esp, 8 ve movzx edx, al ekleyin)
BÜLTENİ İNŞA ET
dize :: operatörü == ()
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)
dize :: karşılaştırma ()
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)
Her iki montaj kodu da derleyicinin optimizasyon gerçekleştirmesine çok benzer.
Son olarak, benim görüşüme göre, performans artışı göz ardı edilebilir, bu yüzden her ikisi de aynı sonucu elde ettiği için hangisinin tercih edileceğine karar vermek için gerçekten geliştiriciye bırakacağım (özellikle sürüm oluşturma olduğunda).