grep是否使用缓存来加快搜索速度?


35

我注意到,grep在同一查询(以及不同的查询,但在同一文件上)的后续运行比第一次运行快得多(在搜索大​​文件时,效果很明显)。

这表明grep对用于搜索的结构进行了某种形式的缓存,但是我在Internet上找不到参考。

哪种机制可以grep在后续搜索中更快地返回结果?

Answers:


59

并非grep如此,但是文件系统本身经常缓存最近读取的数据,由于grep可以在内存而不是磁盘中进行有效搜索,因此导致以后的运行速度更快。


2
我同意。第一次grep文件时,文件系统代码会将文件从磁盘加载到缓存中;当您不久之后再次对其进行grep时,它还没有时间从缓存中过期。查看是否有一种方法可以手动刷新文件系统缓存,然后比较时间前后。
2011年

3
@Shadur-有一种方法。见unix.stackexchange.com/questions/8398/...
mattdm

3
没有实际的区别,但这是内核缓存,而不是文件系统。
pboin 2011年

@pboin好的,我采取了一条小捷径。当然,内核是处理文件系统的部分,而不是文件系统(在磁盘上)进行缓存。卑鄙的但真实的。:)
PaulRein 2011年

19

Linux和* NIX系统利用位于文件系统(通过VFS进行抽象)和用户级进程之间的各种缓存。因此,它不是grep,也不是文件系统在进行缓存-它是操作系统。

负责您的grep性能的缓存是VFS缓冲区缓存。其他缓存用于inode和目录,但是这些缓存在这里不起作用。

有关更多信息,请参见:Linux文档项目:9.2虚拟文件系统http://tldp.org/LDP/tlk/fs/filesystem.html


5
如果您正在执行递归grep,则inode和dentry缓存会产生明显的不同。在测试中,一个grep在/usr/include我的系统上花了〜16.4秒,所有缓存均被删除。缓存所有内容后,大约需要0.3秒。如果仅丢弃页面高速缓存(用于保存缓冲区高速缓存),则大约需要14.3秒。如果我离开页面缓存并删除dentry / inode缓存,则大约需要12秒。
mattdm 2011年

@mattdm,这很有趣。您是如何删除缓存的?
JRW 2011年


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.