我不确定下面的代码有多快。如果有人知道比这更快/更优化的代码,请告诉我。
int xstrcmp(char *s1, char *s2)
{
while (*s1 == *s2++)
if (*s1++ == 0)
return (0);
return (*(const unsigned char *)s1 - *(const unsigned char *)(s2-1));
}
我不确定下面的代码有多快。如果有人知道比这更快/更优化的代码,请告诉我。
int xstrcmp(char *s1, char *s2)
{
while (*s1 == *s2++)
if (*s1++ == 0)
return (0);
return (*(const unsigned char *)s1 - *(const unsigned char *)(s2-1));
}
使用::strcmp
代替手写版本。你的编译器供应商很可能有一个仅使用CPU特定功能进行比较的汇编版本(例如,SSE4.2有专门用于快速字符串比较的指令)。例如,MSVC版本是用汇编语言编写的,并尽可能使用更大的比较操作(整个单词而不是单个字符),特殊处理字符串的非对齐开头/结尾(如果你安装了VS2010,则在VC/crt/src/intel/strcmp.asm
中)。
if (a[0]==b[0] && strcmp(a, b)==0){.....
strcmp
,而大多数情况下它们并不匹配。strcmp
出现超过一次,我就知道它需要很长时间并且没有被内联。如果它被内联了,我可能会在strcmp
的初始指令中看到它,否则,就不值得担心了。 - Mike Dunlaveystrcmp
在字符串相等且较长的情况下会尽力优化。这是为了处理通常不太可能出现的情况而产生的很多开销。根据我的经验,大部分时间字符串都很短,并且通常只有第一个字符不同。 - Mike Dunlavey
char const*
。 - Dietmar Kühl