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

Gg *_* Gg 3 c++ optimization performance

请问有谁能告诉我比较两个常数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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

提前致谢

Cra*_*rks 7

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

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

使用GCC,如果您知道您的目标是支持SSE3的CPU,您还可以指定-msse3命令行开关,为字符串比较生成稍高效的机器指令.然而,它主要有助于区分大小写.

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