ภายในใช้string::operator==()
string::compare()
โปรดอ้างอิงถึง: CPlusPlus -string::operator==()
ผมเขียนโปรแกรมขนาดเล็กเพื่อเปรียบเทียบประสิทธิภาพการทำงานและเห็นได้ชัดถ้าคุณรวบรวมและเรียกใช้รหัสของคุณในสภาพแวดล้อมการแก้ปัญหาจะเร็วกว่าเล็กน้อยstring::compare()
string::operator==()
อย่างไรก็ตามถ้าคุณคอมไพล์และรันโค้ดในสภาวะแวดล้อม Release ทั้งคู่ก็เหมือนกัน
FYI ฉันวิ่ง 1,000,000 ซ้ำเพื่อหาข้อสรุปดังกล่าว
เพื่อพิสูจน์ว่าทำไมในสภาพแวดล้อมการแก้ปัญหาสตริง :: การเปรียบเทียบเร็วขึ้นฉันไปที่การชุมนุมและนี่คือรหัส:
สร้างข้อบกพร่อง
สตริง :: ประกอบ == ()
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)
รหัสการประกอบทั้งสองมีความคล้ายคลึงกันมากเนื่องจากคอมไพเลอร์ทำการปรับให้เหมาะสม
ในที่สุดในความคิดของฉันการเพิ่มประสิทธิภาพนั้นเล็กน้อยดังนั้นฉันจะปล่อยให้นักพัฒนาตัดสินใจจริงๆว่าจะเลือกอันไหนดีกว่าทั้งคู่ให้ได้ผลลัพธ์เดียวกัน (โดยเฉพาะอย่างยิ่งเมื่อมีการปล่อยบิลด์)