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