内部的には、string :: operator ==()はstring :: compare()を使用しています。 CPlusPlus - 文字列::演算子==()を参照してください。
コンパイルしてデバッグ環境でコードを実行すると、文字列:: compare()がstring :: operator ==()よりも少し速くなっているようです。ただし、リリース環境でコードをコンパイルして実行すると、どちらもほぼ同じです。
参考までに、私はそのような結論を出すために1,000,000回の繰り返しを実行しました。
なぜデバッグ環境でなぜ文字列:: compareが速いのかを証明するために、私はアセンブリに行きました、そして、ここにコードがあります:
デバッグビルド
string :: operator ==()
if (str1 == str2)
00D42A34 lea eax,[str2]
00D42A37 push eax
00D42A38 lea ecx,[str1]
00D42A3B push ecx
00D42A3C call std::operator==,std::allocator > (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,std::allocator >::compare (0D23582h)
00D424E0 test eax,eax
00D424E2 jne Algorithm::PerformanceTest::stringComparison_usingCompare1+0BDh (0D424EDh)
string :: operator ==()では、追加の操作(esp、8とmovzx edx、alを追加)を実行する必要があることがわかります。
RELEASE BUILD
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,std::allocator >::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,std::allocator >::compare (0853B80h)
両方のアセンブリコードは、コンパイラが最適化を実行するのと非常によく似ています。
最後に、私の意見では、パフォーマンスの向上はごくわずかなので、どちらがどちらの方が同じ結果を達成するか(特にリリースビルド時)を決定するには、開発者に任せています。