我尝试在一台x64计算机上编译这个程序:
#include <cstring>
int main(int argc, char* argv[])
{
return ::std::strcmp(argv[0],
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really long string"
);
}
我是这样编译它的:
g++ -std=c++11 -msse2 -O3 -g a.cpp -o a
但是生成的反汇编代码是这样的:
0x0000000000400480 <+0>: mov (%rsi),%rsi
0x0000000000400483 <+3>: mov $0x400628,%edi
0x0000000000400488 <+8>: mov $0x22d,%ecx
0x000000000040048d <+13>: repz cmpsb %es:(%rdi),%ds:(%rsi)
0x000000000040048f <+15>: seta %al
0x0000000000400492 <+18>: setb %dl
0x0000000000400495 <+21>: sub %edx,%eax
0x0000000000400497 <+23>: movsbl %al,%eax
0x000000000040049a <+26>: retq
为什么没有使用SIMD?我想这是因为可以一次比较16个字符。我应该编写自己的SIMD strcmp
,还是出于某些原因这个想法是无意义的?
std::string::operator==
进行字符串比较。提前检查字符串长度是非常有效的优化方法。另外:使用哪个编译器,哪些设置? - MSaltersstd::string
的O(1)长度测试很棒。你不仅知道是否有比较内容的必要,而且当长度相等时,你还知道需要比较多少内容。因此,我不相信strcmp
是出于性能原因而被使用的说法。(GCC的std::string
实现已过时,这也可能很重要) - MSaltersstd::string
在进行任何更改时都会存储字符串的长度。因此,如果在所有地方都使用std::string
进行比较,可能会更快。 - RamblingMad