有人能请告诉我比较两个常数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,在我的情况下有可能发生。
还有其他有助于提高性能的替代方案吗?
提前致谢
答案 0 :(得分:7)
没有有效的方法来比较两个字符串。
基本stricmp()
有几种方法可以改进,如果它在个人资料中显示得非常高(我在实际应用中看到过)。您可能会发现大部分成本都在tolower()
中,这是一个在每个字符上调用的函数,用于在比较之前将其从大写转换为小写。这个函数调用的开销,加上它的主体成本,可以累积大量的时间,因为它必须是区域敏感的并处理像Ö这样的字母。如果你知道你的比较只会在一个语言环境中执行(即只用英语),那么你可以通过构建一个256个字符的ASCII查找表并手动实现stricmp()来加速tolower()。
使用GCC,如果您知道您的目标是支持SSE3的CPU,您还可以指定-msse3
命令行开关,为字符串比较生成稍高效的机器指令。然而,这主要有助于案例敏感比较。
在我的工作中,任何需要比较大量常量字符串的算法,与使用实习或符号来表示此类标识符相反,都被视为代码气味。在一个项目中,分析表明大约7%的CPU时间花费在stricmp
内的tolower()中。这实际上是每个数据中心100台机器中的7台,除了将大写字母转换为小写字母外什么都不做。
答案 1 :(得分:3)
stricmp
可能比你自己写的任何东西都快,除非你知道这将是你的程序性能的瓶颈,否则你不应该费心。