Unix grep 使用长搜索词还是短搜索词更快?

Juh*_*nen 8 unix performance speed grep

查找长搜索词还是短搜索词更快?或者它会影响速度吗?换句话说,您是否应该使搜索词尽可能准确?

有超过 100 000 个文件,每个文件包含 20 到 5000 多行数据。通常 grep 仅用于查找搜索词的一个实例。

假设搜索词是SEARCHTERM,它将像这样连续排列:

NAD+DP+1234567890:92++UNIQUE+NAME+SEARCHTERM++12345+FI'
Run Code Online (Sandbox Code Playgroud)

寻找“SEARCH”或“SEARCHTERM”是否更快?假设在这种情况下,我们不关心是否也在其他不相关的行中找到匹配项。

这是我目前的做法:

grep NAD+DP 123* | grep SEARCHTERM
Run Code Online (Sandbox Code Playgroud)

但我发现它仍然很慢。查找数据通常需要大约 3-5 分钟,即使我知道粗略的文件名,这将范围限制为大约 10 000 个文件。

那么,更长或更短的搜索词会有帮助吗?据我所知,grep 寻找一定长度的单词的“块”?

小智 9

一些参考资料:

GNU grep 使用著名的 Boyer-Moore 算法,该算法首先查找目标字符串的最后一个字母,并使用查找表告诉它在找到不匹配字符时可以在输入中跳过多远。

来自为什么 GNU grep 很快

该算法预处理正在搜索的字符串(模式),而不是在(文本)中搜索的字符串。[...] 一般来说,随着模式长度的增加,算法运行得更快。

来自Boyer-Moore 字符串搜索算法

结论:使用更长的字符串

现在,一些有趣的基准测试:

# Initialisation
cd $(mktemp -d) && dd if=/dev/urandom of=random bs=1M count=1000
# Version
grep --v` # grep (GNU grep) 2.9
# Benchmark
(for s in 'short' 'this is not so short and we could even consider this as pretty long'; do for t in {1..10}; do time grep "$s" random; done; done ) 2> result
Run Code Online (Sandbox Code Playgroud)

结果:0.952s 是短字符串的平均值,0.244s 是长字符串的平均值。

注意:长度不是唯一需要考虑的标准。