对于不区分大小写的字符串比较,请避免使用逐个字符的函数

2020-05-02 17:53:51

有时,我们需要以不区分大小写的方式比较字符串。例如,您可能希望考虑‘abc’和‘abc’。对于ASCII字符串来说,这是一个定义明确的问题。在C/C++中,基本上有两种常见的方法。您可以进行整个字符串比较:

或者,您可以逐个字符进行比较,将每个字符映射到小写版本,然后进行比较:

bool等于{true};for(size_t i=0;i<;N;i++){if(tolower(string 1[i])!=tolower(string 2[i])){is_the_ame=false;Break;}}。

直观地说,第二个版本更糟糕,因为它需要更多的代码。我们可能还会认为它会更慢。慢了多少?我编写了一个快速基准来测试它:

我在linux下用GNU GCC得到了这些结果。和运行MacOS的另一台计算机上。

因此,对于较大的字符串,逐个字符的方法可能要慢4到40倍!根据您的标准库和一天中的不同时间,结果会有所不同。然而,在我所有的测试中,strncasecmp总是要快得多。(注:Microsoft以不同的名称提供类似的功能,例如参见_strnicmp。)。

你能开快点吗?我试着滚动我自己的,它的运行速度大约是0.3 ns/字节。因此,它在MacOS下比竞争对手快,但在Linux下比竞争对手慢。我怀疑Linux下的标准库必须依赖于矢量化的实现,这可能解释了它是如何以两倍的优势击败我的。