在检查字符串是否相同之前比较字符串长度是否会给我带来不可忽略的 C 速度提升?
Will comparing string length before checking if string is the same yield me non-negligible speed increases for C?
对使用 C 语言编程非常陌生,如果我有严重的误解,请见谅。如果有人熟悉这个,我目前正在做 CS50 的拼写问题集,我给出了文本中的单词,通过将它们与给定的词典进行比较来检查它们是否拼写正确。我已经将这本字典排序为一个散列 table,其中包含大约 17,000 个桶,平均指向一个长度约为 100 个节点的链表。可能有几十万个单词需要拼写检查。
我的问题是,将使用 strlen()
检查字典中每个单词的长度是否与需要进行拼写检查的单词的长度匹配,然后仅使用 strcmp()
如果长度匹配,比使用 strcmp()
.
检查字符串是否匹配要快
我确实可能看到,如果有很多单词的长度与您要检查的单词的长度相同,检查长度会对您不利,但我想知道速度是否会提高,如果有的话,通过检查长度更不常见的单词的长度将弥补这一点。
Will comparing string length before checking if string is the same yield me non-negligible speed increases for C?
要么你明确地保留字符串字节(作为flexible array member) with its length in some struct
, and then yes, you could win a tiny bit of performance, or you use strlen which will scan all the bytes. Be aware of CPU cache. Study for inspiration the source code of open source libraries like Glib(他们像你一样实现哈希表......)
有关更多信息,请阅读 Modern C and study the source code of open source implementations such as GNU libc and GCC。
一个类似的问题是在 C 中实现矩阵。然后查看 。
实际上,您应该进行基准测试。
如果你使用Linux and GCC, compile with gcc -pg -O2 -Wall
then use gprof(1) or time(1) or perf(1) to profile your program. See of course time(7) and syscalls(2).
对于其他编译器或操作系统,请阅读它们的文档。
在您的代码中,性能提升实际上可以忽略不计(百分之几)。大多数英语单词的长度都小于 16 个字节,这将适合 L1 缓存行(在 2020 年的当前笔记本电脑处理器上)。
strcmp
是一个 O(n) 操作 - 它遍历两个字符串,直到其中一个字符串结束或遇到一对不匹配的字符,所以乍一看比较长度听起来是个好主意。 但是 ,C 中的 strlen
也是一个 O(n) 操作 - 它需要一个 char*
并迭代直到它遇到一个 [=13=]
字符。因此,天真地使用 strlen
实际上可能会使您的程序变慢。
对使用 C 语言编程非常陌生,如果我有严重的误解,请见谅。如果有人熟悉这个,我目前正在做 CS50 的拼写问题集,我给出了文本中的单词,通过将它们与给定的词典进行比较来检查它们是否拼写正确。我已经将这本字典排序为一个散列 table,其中包含大约 17,000 个桶,平均指向一个长度约为 100 个节点的链表。可能有几十万个单词需要拼写检查。
我的问题是,将使用 strlen()
检查字典中每个单词的长度是否与需要进行拼写检查的单词的长度匹配,然后仅使用 strcmp()
如果长度匹配,比使用 strcmp()
.
我确实可能看到,如果有很多单词的长度与您要检查的单词的长度相同,检查长度会对您不利,但我想知道速度是否会提高,如果有的话,通过检查长度更不常见的单词的长度将弥补这一点。
Will comparing string length before checking if string is the same yield me non-negligible speed increases for C?
要么你明确地保留字符串字节(作为flexible array member) with its length in some struct
, and then yes, you could win a tiny bit of performance, or you use strlen which will scan all the bytes. Be aware of CPU cache. Study for inspiration the source code of open source libraries like Glib(他们像你一样实现哈希表......)
有关更多信息,请阅读 Modern C and study the source code of open source implementations such as GNU libc and GCC。
一个类似的问题是在 C 中实现矩阵。然后查看
实际上,您应该进行基准测试。
如果你使用Linux and GCC, compile with gcc -pg -O2 -Wall
then use gprof(1) or time(1) or perf(1) to profile your program. See of course time(7) and syscalls(2).
对于其他编译器或操作系统,请阅读它们的文档。
在您的代码中,性能提升实际上可以忽略不计(百分之几)。大多数英语单词的长度都小于 16 个字节,这将适合 L1 缓存行(在 2020 年的当前笔记本电脑处理器上)。
strcmp
是一个 O(n) 操作 - 它遍历两个字符串,直到其中一个字符串结束或遇到一对不匹配的字符,所以乍一看比较长度听起来是个好主意。 但是 ,C 中的 strlen
也是一个 O(n) 操作 - 它需要一个 char*
并迭代直到它遇到一个 [=13=]
字符。因此,天真地使用 strlen
实际上可能会使您的程序变慢。