【问题标题】:Is strncmp faster than strcmpstrncmp 比 strcmp 快吗
【发布时间】:2017-01-02 10:21:25
【问题描述】:

strcmp 是否比strncmp 慢,因为可以为其提供预先计算的字符串长度,但strcmp 没有收到此类信息?

我正在写一个解释器。我知道这些功能都经过优化。我想知道什么是更好的方法(就性能而言),因为无论如何我都会扫描并且我会知道偏移位置和长度。

【问题讨论】:

  • 不是真的,无论如何你必须扫描。请记住,它最多,不完全是。
  • 那些反对票必须是因为“缺乏研究”(根据其工具提示)。对常见实现的粗略搜索显示没有使用长度。两者都只是测试null 字符。
  • 对于实际调用,这取决于限制与字符串长度的比较。如果您有一个 1,000 字节的字符串,但指定 limit = 10,它会更快。但是如果你指定limit = 900,它可能会更慢。
  • @Malina strncmp() 仍然需要检查空字符,因为即使limit 更大,它也必须停止在那里复制。
  • strncmp() 的参数不是给定的长度,而是最大长度。

标签: c string performance optimization strcmp


【解决方案1】:

它们做不同的事情,因此直接比较它们是没有意义的。 strncmp 比较字符串的第一个 n(或更少,如果字符串结束得更早)字符。 strcmp 比较整个字符串。如果n 足够大以至于strncmp 将比较整个字符串(因此行为实际上与strcmp 相同),那么strncmp 可能会稍微慢一些,因为它还必须跟踪计数器,但在给定的实现中,差异可能是可测量的,也可能是不可测量的,甚至是存在的。例如,strcmp 的实现可以将SIZE_MAX 作为n 的值传递给strncmp

【讨论】:

  • 有些 CPU 对此有特殊说明。他们实际上甚至可以更快。 (一个突出的历史例子是 68010,参见DBcc 和循环缓存)。 AFAIK x86 可以做类似的事情。但即使没有这个,超标量 CPU 也可以非常快地处理两个循环。
【解决方案2】:

只有一种方法可以知道:对其进行基准测试。猜测是没有用的。

确保使用足够多的字符串并在具有代表性的条件下执行此操作(字符串长度的统计分布和匹配前缀长度的统计分布)。

我敢打赌,不会有显着差异。

【讨论】:

    【解决方案3】:

    您说性能是一个问题,所以让我们集中精力解决这个问题。

    库函数的实现因编译器供应商而异,也因同一编译器或开发环境的不同版本而异。因此,Yves Daoust 说“只有一种方法可以知道:基准测试”是正确的。

    我会更进一步,建议如果您还没有分析您的代码,您可以先这样做。瓶颈经常出现在您意想不到的地方。

    不过,如果您有源代码,比较 strcmp()strncmp() 的实现可能会有所帮助。

    我曾经发现自己处于与您几乎相同的情况。(编写一个使用多个基于字符的终端后端来完成工作的前端信息显示。它需要对多个文本缓冲区进行重复的近实时解析。 ) 我们当时使用的 Borland 编译器效率低下 strncmp()。由于处理器具有用于比较字符缓冲区的长度限制指令,因此我使用汇编程序编写了 strncmp 的特殊变体。 “之前和之后”的基准测试和分析表明我们已经消除了主要瓶颈。

    几年后,当人们回去改进和现代化该系统时,编译器及其库发生了变化(并且处理器升级了):不再需要(现已过时的)特殊版本。新的基准测试还显示,由于编译器的变化,瓶颈已经转移,需要进行不同的优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-23
      • 2012-10-17
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多