我需要检查字符串以查看它是否与任何前缀匹配。 future 要比较的前缀数量会增加。所以我担心下面代码的性能。当需要检查大量字符串时,有哪些选项可以使其运行得更快?
int checkString(const char *name)
{
if(!name) return 0;
if(strncmp(name, "AE_", 3) == 0 ) return 1;
if(strncmp(name, "AEDZ_", 5) == 0 ) return 1;
if(strncmp(name, "EDPZ_", 5) == 0 ) return 1;
if(strncmp(name, "EFAN_", 5) == 0 ) return 1;
if(strncmp(name, "E_GCA", 5 ) == 0 ) return 1;
if(strncmp(name, "EFFAN_", 6) == 0 ) return 1;
if(strncmp(name, "EPDPZ_", 6) == 0 ) return 1;
if(strncmp(name, "EDDPZ_", 6) == 0 ) return 1;
if(strncmp(name, "ECADF_", 6) == 0 ) return 1;
if(strncmp(name, "EPCEA_", 6) == 0 ) return 1;
if(strncmp(name, "CFEXXX_", 7) == 0 ) return 1;
if(strncmp(name, "IFEXX_", 7) == 0 ) return 1;
if(strncmp(name, "EINFFAN_", 8) == 0 ) return 1;
if(strncmp(name, "NXXEFAN_", 8) == 0 ) return 1;
if(strncmp(name, "ENAEAZY_", 8) == 0 ) return 1;
if(strncmp(name, "EYYYYYY_", 8) == 0 ) return 1;
if(strncmp(name, "ENEOENUE_", 9) == 0 ) return 1;
/*
more strncmp to be added.
*/
return 0;
}
最佳答案
一次性、提前设置:
regex_t re;
regcomp(&re, "^(AE_|AEDZ|_EDPZ_|EFAN_|E_GCA|" /*...*/ ")", REG_EXTENDED);
检查:
return regexec(&re, name, 0, 0, 0) == 0;
在任何良好的正则表达式实现中,regcomp
会将正则表达式编译为 DFA,该 DFA 在最长前缀的长度范围内执行多个步骤。
关于c - 如何在多个 strncmp 以下进行优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52998114/