比较两个字符串的最佳或最快方法是什么?

Jat*_*tin 5 c++ string performance

我不确定下面的代码有多快.如果有人知道比这更快/更优化的代码,请告诉我.

int xstrcmp(char *s1, char *s2)
{
  while (*s1 == *s2++)
            if (*s1++ == 0)
                    return (0);
  return (*(const unsigned char *)s1 - *(const unsigned char *)(s2-1));
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*eru 16

使用::strcmp而不是您自己的手动滚动版本.您的编译器供应商很可能只使用特定于汇编的版本进行比较(例如,SSE4.2具有快速字符串比较的特殊指令.)例如,MSVC版本以汇编语言编写并使用较大的比较(整个单词)而不是单个字符)尽可能,特殊的套管未对齐字符串的开头/结尾(如果你安装了VS2010,它就在VC/crt/src/intel/strcmp.asm.)

  • 你不会在性能上击败内置函数,但它肯定无关紧要.如果你只是玩游戏,你的strcmp实现就足够了,所有进一步的加速都相当复杂. (2认同)

Kev*_*Hsu 5

你有没有测量过这比strcmp快多少?C strcmp应该已经很好地优化了.

您可以采取的其他一些方法:

  • 如果您已经知道字符串的长度,请使用memcmp.
  • 通过将字符串重新解释为int32或int64数组,并将余数字符作为字符处理,一次比较4或8个字符.
    • 如果指针指向非4字节或8字节对齐的内存,则可能会出现问题,因此请比较字符直到达到对齐为止


Mik*_*vey 5

如果我要测试相等性,有时我会这样写:

if (a[0]==b[0] && strcmp(a, b)==0){.....
Run Code Online (Sandbox Code Playgroud)

所以它只会strcmp在第一个字符匹配时调用,大多数情况下它们不匹配。

  • @StefanRein:但是调用该函数会产生开销。这就是它试图挽救的。在大多数情况下,这无关紧要,但在这会消耗大量时间的情况下,这确实很重要。 (4认同)