在检查字符串是否相同之前比较字符串长度是否会使C的速度增加不可忽略?

问题描述

对于C语言编程来说是非常新的知识,如果我对某些事情有误解,请对不起。如果有人对此有所了解,我目前正在使用CS50设置的拼写问题,并且我从文本中给出了单词以通过将它们与给定的字典进行比较来检查它们的拼写是否正确。我已将此字典排序到一个散列表中,该散列表具有大约17,000个存储桶,这些存储桶平均指向一个链表,链表的长度约为100个节点。可能有数十万个单词需要拼写检查。

我的问题是,将检查字典中每个单词的长度是否与使用strlen()进行拼写检查所需的单词长度匹配,然后再使用strcmp(),除非长度匹配,比使用strcmp()检查字符串是否匹配要快。

我确实可能会发现,如果有很多单词的长度与您要检查的单词相同,那么检查长度会不利于您,但我想知道通过检查速度是否会提高速度(如果有的话)长度较短的单词的长度将弥补这一点。

解决方法

在检查字符串是否相同之前是否会比较字符串长度,是否会导致C的速度增加不可忽略?

要么明确地将字符串字节(作为flexible array member)的长度保留在struct中,然后是的,您可以获得一点点的性能,或者您使用strlen将扫描所有字节。请注意CPU cache研究灵感open source libraries的源代码,例如Glib (它们像您一样实现哈希表...)

有关更多内容,请阅读Modern C并研究GNU libcGCC之类的开源实现的源代码。

类似的问题是在C中实现矩阵。然后查看this answer

实际上,您应该进行基准测试。

如果您使用LinuxGCC,则编译with gcc -pg -O2 -Wall,然后使用gprof(1)time(1)perf(1)来{ {3}}您的程序。当然请参见profiletime(7)

对于其他编译器或操作系统,请阅读其文档。

在您的代码中,实践中可能会忽略性能提升(百分之几)。大多数英语单词的字节数都少于16个字节,适合L1高速缓存行(2020年将在当前笔记本电脑处理器上使用)。

,

strcmp是一个O(n)操作-遍历两个字符串,直到其中一个结束或遇到不匹配的字符对,因此乍一看,比较长度听起来是个好主意。 但是,C中的strlen也是O(n)操作-它需要char*并进行迭代,直到遇到\0字符为止。因此,仅天真地使用strlen实际上可能会使您的程序变慢。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...