내부적으로 string::operator==()
를 사용하고 string::compare()
있습니다. 다음을 참조하십시오 : CPlusPlus-string::operator==()
성능을 비교하기 위해 작은 응용 프로그램을 작성했으며 디버그 환경에서 코드를 컴파일하고 실행하는 string::compare()
경우 약간 더 빠릅니다.string::operator==()
. 그러나 릴리스 환경에서 코드를 컴파일하고 실행하면 둘 다 거의 동일합니다.
참고로, 나는 그러한 결론을 내기 위해 1,000,000 반복을 실행했습니다.
디버그 환경에서 string :: compare가 더 빠른 이유를 증명하기 위해 어셈블리로 갔으며 코드는 다음과 같습니다.
디버그 빌드
문자열 :: 연산자 == ()
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)
문자열 :: 비교 ()
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 == ()에서 추가 작업을 수행해야한다는 것을 알 수 있습니다 (esp, 8 및 movzx edx, al 추가)
릴리스 빌드
문자열 :: 연산자 == ()
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)
문자열 :: 비교 ()
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)
두 어셈블리 코드는 컴파일러가 최적화를 수행하는 것과 매우 유사합니다.
마지막으로, 필자의 의견으로는 성능 향상이 무시할만한 수준이므로 개발자가 동일한 결과를 달성 할 때 (특히 릴리스 빌드 일 때) 어느 것이 선호되는지 결정하도록 개발자에게 맡길 수 있습니다.