【问题标题】:What is the best or fastest way to compare two strings?比较两个字符串的最佳或最快方法是什么?
【发布时间】:2012-03-15 14:09:57
【问题描述】:

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

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

【问题讨论】:

  • 您要比较的字符串有多大?他们来自哪里?
  • 这是一道作业题吗?如果不使用供应商提供的那个。他们可能有更多可以利用处理器/编译器特性的技巧
  • 如何查到厂商给的code??
  • 你的函数签名错误:参数应该是char const*
  • 我想知道是否有人将蒙特卡洛算法 (en.wikipedia.org/wiki/Monte_Carlo_algorithm) 与解决此问题的常用方法进行了比较?

标签: c++ string performance


【解决方案1】:

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

if (a[0]==b[0] && strcmp(a, b)==0){.....

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

【讨论】:

  • 这个没用,这已经在strcmp的实现中了:stackoverflow.com/a/12136398/4641479
  • @StefanRein:但是调用函数有开销。这就是它试图拯救的东西。在大多数情况下,这无关紧要,但在这会消耗大量时间的情况下,它确实很重要。
【解决方案2】:

使用::strcmp 而不是您自己的手卷版本。您的编译器供应商很可能有一个仅使用 CPU 特定功能进行比较的纯汇编版本(例如,SSE4.2 有用于快速字符串比较的特殊说明。)例如,MSVC 版本是用汇编编写的,并且使用更大的比较(整个单词而不是单个字符)尽可能多的特殊大小写未对齐字符串的开头/结尾(如果您安装了 VS2010,它在VC/crt/src/intel/strcmp.asm。)

【讨论】:

  • 实际上,我被告知不要使用任何内置函数。我必须编写自己的字符串比较版本:(
  • 我只是在开发我的概念......所以我选择不选择任何内置函数。
  • 你不会在性能上击败内置函数,但这肯定没关系。如果你只是玩玩,你的 strcmp 实现已经足够好了,所有进一步的加速都相当复杂。
  • 我能理解你想自己写这样的东西……重新发明轮子可能是一种非常令人满意的体验。但如果是这样的话,要求其他人提供他们的代码不是一种作弊形式吗?另一方面,如果您追求的是性能,那么没有什么比内置例程更好的了。那你想做什么呢?
  • 嗯,手写的汇编更好,但你的可能不会太远。你想达到什么目的?一个相当快的strcmp?你已经完成了,你的和其他的一样好。最快的strcmp?然后你必须从汇编版本开始,并针对现代 CPU 等进行调整。但在小字符串上,你最终不太可能比内置 strcmp 的多年优化更快。
【解决方案3】:

你测量过这比 strcmp 快多少吗? C strcmp 应该已经优化好了。

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

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

【讨论】:

  • 我不知道如何衡量我的代码有多快。我确信这段代码不会是最快的。
  • 您可以编写一个测试程序,对随机字符串执行数百万次 strcmp 和 xstrcmp。然后,在代码上运行分析器(例如 google 的 gperf)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多