strcmp
慢于strncmp
,因为可以为其预先计算字符串长度,但strcmp
不会收到此类信息吗?
我正在写一名翻译。我知道这些功能都是优化的。我想知道什么是更好的方法(在性能方面),因为我将进行扫描,我将知道偏移位置因此长度。
答案 0 :(得分:3)
他们做不同的事情,所以直接比较它们是没有意义的。 strncmp
比较字符串中的第一个n
(或更少,如果字符串更早结束)字符。 strcmp
比较整个字符串。如果n
足够大,strncmp
将比较整个字符串(以便行为实际上与strcmp
相同),那么strncmp
可能会适度减慢,因为它还必须跟踪计数器,但差异可能是也可能不是可测量的,甚至不存在于给定的实现中。例如,strcmp
的实现可以将SIZE_MAX
作为n
的值传递给strncmp
。
答案 1 :(得分:2)
只有一种方法可以知道:基准测试。猜测是没有用的。
请务必使用足够多的字符串和代表性条件(字符串长度的统计分布和匹配前缀长度的统计分布)。
我敢打赌,没有显着差异。
答案 2 :(得分:0)
您声明性能是一个问题,所以让我们集中精力。
库功能的实现因编译器供应商而异,并且在同一编译器或开发环境的各个版本中也有所不同。因此,伊夫·戴乌斯特(Yves Daoust)说“只有一种知道的方法:对它进行基准测试”是正确的。
我会进一步建议如果您尚未分析代码,则从此开始。瓶颈常常出乎您意料之外的令人惊讶的地方。
但是,如果有源代码,比较strcmp()
和strncmp()
的实现可能会有所帮助。
我曾经发现自己处于与您几乎相同的情况。(编写一个前端信息显示,使用多个基于字符的终端后端来完成其工作。它需要重复近实时地解析多个文本缓冲区。 )我们当时使用的Borland编译器的strncmp()
效率很低。由于处理器具有用于比较字符缓冲区的长度受限指令,因此我使用汇编器编写了strncmp的专用变体。 “之前和之后”基准测试和分析表明,我们消除了主要瓶颈。
数年后,当人们回去改进和现代化该系统时,编译器及其库已更改(并且处理器已升级):不再需要(现在已过时)特殊版本。新的基准测试还显示,由于更改了编译器,瓶颈已经转移,需要进行不同的优化。