strncmp 比 strcmp 快吗

Is strncmp faster than strcmp

strcmp 是否比 strncmp 慢,因为可以给它预先计算的字符串长度,但是 strcmp 没有收到这样的信息?

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

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

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

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

我打赌不会有显着差异。

您说性能是个问题,所以让我们专注于此。

库函数的实现因编译器供应商而异,并且在同一编译器或开发环境的不同版本之间也不同。因此,Yves Daoust 说 "there is only one way to know: benchmark it."

是正确的

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

不过,如果您有源代码,比较 strcmp()strncmp() 的实现可能会有一些好处。

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

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