Trong nội bộ, string::operator==()
đang sử dụng string::compare()
. Vui lòng tham khảo: CPlusPlus -string::operator==()
Tôi đã viết một ứng dụng nhỏ để so sánh hiệu suất và rõ ràng nếu bạn biên dịch và chạy mã của mình trên môi trường gỡ lỗi string::compare()
thì nhanh hơn một chút string::operator==()
. Tuy nhiên, nếu bạn biên dịch và chạy mã của mình trong môi trường Phát hành, cả hai đều khá giống nhau.
FYI, tôi đã chạy 1.000.000 lần lặp để đưa ra kết luận như vậy.
Để chứng minh tại sao trong môi trường gỡ lỗi, chuỗi :: so sánh nhanh hơn, tôi đã đi đến hội đồng và đây là đoạn mã:
XÂY DỰNG DEBUG
chuỗi :: toán tử == ()
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)
chuỗi :: so sánh ()
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)
Bạn có thể thấy rằng trong chuỗi :: toán tử == (), nó phải thực hiện các hoạt động bổ sung (thêm đặc biệt, 8 và Movzx edx, al)
XÂY DỰNG
chuỗi :: toán tử == ()
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)
chuỗi :: so sánh ()
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)
Cả hai mã lắp ráp rất giống như trình biên dịch thực hiện tối ưu hóa.
Cuối cùng, theo ý kiến của tôi, mức tăng hiệu suất là không đáng kể, do đó tôi thực sự sẽ để nó cho nhà phát triển quyết định xem cái nào là ưu tiên nhất vì cả hai đều đạt được kết quả như nhau (đặc biệt là khi nó được phát hành bản dựng).