【问题标题】:efficient and portable strcmp for reverse strings用于反向字符串的高效且可移植的 strcmp
【发布时间】:2012-09-24 11:10:39
【问题描述】:

strcmp,至少使用 g++,对许多架构进行了许多优化。在我的电脑 Core2Duo E8400 中,strcmp 比使用直接实现要快两倍。

我的问题是否存在一些提供比较两个“反向字符串”的函数的库。反向字符串char *s1s1 开始,以s1-n 结束,这样s1-n == '\0'(其中n >= 0 和所有0 <= n' < n, s1-n' != '\0')。

当然,要求是这个函数必须像strcmp一样高效便携。

编辑:我只需要知道两个字符串是否相等(所以我不需要知道哪个更大。原则上,相同的 strcmp 优化适用于反向字符串)。

【问题讨论】:

  • 我愿意打赌答案是否定的。以零结尾的字符串很常见。以\0开始的字符串几乎闻所未闻。那么,谁为这些不寻常的事情编写了一个库?
  • 这是我见过的最奇怪的要求之一! :)
  • 我确信可以做到,但似乎找不到这样的实现。祝你好运。
  • 为什么不能使用strcmp() 的现有源代码并减少两个输入指针,而不是增加? fossies.org/dox/glibc-2.16.0/strcmp_8c_source.html
  • @user1476999:哦,当然不是。但是您仍然可以使用\0 LAST 存储这些字符串。 IE。 X-xiferp\0, Y-xiferp\0 等。然后你可以使用常规的strcmp

标签: c performance strcmp


【解决方案1】:

据我所知,针对特定体系结构的大多数 strcmp 优化都使用了将多个字节一起比较的技巧,例如使用对齐的指针转换为 long 等。这些类型的优化不太可能与比较字符串的反转一起工作,即反转不会形成相同的,例如long 并再次反转它以生成相同的数字会导致效率损失。所以我认为答案是否定的。

【讨论】:

    【解决方案2】:

    如果我有你的问题,反向strcmp,我会写它。 出于几个原因,不必担心速度。

    首先,将strcmp 作为重要“瓶颈”的程序很少见。

    其次,strcmp 在第一个不相等的字符上停止,因此除非字符串很长且几乎相等,否则平均可能比较很少的字符。 任何花费大量时间比较相等或几乎相等的字符串的程序都在乞求一些性能调整。

    【讨论】:

    • 我已经写了一个反向strcmp。我已经测量了我的程序的性能,如果我可以使用优化为 strcmp 的函数,我将减少大约 5% 的 CPU 使用率,不会更多,但不会产生负面影响。
    • 从我坐的地方,5% is pretty small。可能有更大的问题需要解决。
    猜你喜欢
    • 2011-09-06
    • 2013-05-28
    • 1970-01-01
    • 2021-12-26
    • 2022-01-13
    • 2013-03-17
    • 1970-01-01
    • 2015-05-10
    • 2016-11-21
    相关资源
    最近更新 更多