最有效的const char *比较不区分大小写

时间:2012-03-26 22:47:38

标签: c++ performance optimization

有人能请告诉我比较两个常数char星的最有效方法吗?

#include <iostream>
#include <string>

int main()
{
    const char* value1 = "hello";
    const char* value2 = "HELLO";
    const char* possibility = NULL;


    if(stricmp(value1, value2)==0)
    {
        std::cout <<"\nThey Match!!!!!" << std::endl;
    }
    else{std::cout << "\nThey dont match :("<< std::endl;}

    return 0;
}

我使用了以下标准功能,但我知道它不是最有效的方法吗?

除了stricmp无法处理NULL,在我的情况下有可能发生。

还有其他有助于提高性能的替代方案吗?

提前致谢

2 个答案:

答案 0 :(得分:7)

没有有效的方法来比较两个字符串。

基本stricmp()有几种方法可以改进,如果它在个人资料中显示得非常高(我在实际应用中看到过)。您可能会发现大部分成本都在tolower()中,这是一个在每个字符上调用的函数,用于在比较之前将其从大写转换为小写。这个函数调用的开销,加上它的主体成本,可以累积大量的时间,因为它必须是区域敏感的并处理像Ö这样的字母。如果你知道你的比较只会在一个语言环境中执行(即只用英语),那么你可以通过构建一个256个字符的ASCII查找表并手动实现stricmp()来加速tolower()。

使用GCC,如果您知道您的目标是支持SSE3的CPU,您还可以指定-msse3命令行开关,为字符串比较生成稍高效的机器指令。然而,这主要有助于案例敏感比较。

在我的工作中,任何需要比较大量常量字符串的算法,与使用实习或符号来表示此类标识符相反,都被视为代码气味。在一个项目中,分析表明大约7%的CPU时间花费在stricmp内的tolower()中。这实际上是每个数据中心100台机器中的7台,除了将大写字母转换为小写字母外什么都不做。

答案 1 :(得分:3)

stricmp可能比你自己写的任何东西都快,除非你知道这将是你的程序性能的瓶颈,否则你不应该费心。