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

Laz*_*zer 39 linux grep cache

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

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

什么机制能够grep在后续搜索中更快地返回结果?

小智 63

不是 grep 本身,而是文件系统本身经常缓存最近读取的数据,导致以后运行速度更快,因为 grep 有效地在内存而不是磁盘中搜索。

  • @Shadur — 有办法。请参阅 http://unix.stackexchange.com/questions/8398/how-to-time-grep-commands-accurately (3认同)
  • 没有实际区别,但它是内核缓存,而不是文件系统。 (3认同)
  • 我同意。第一次 grep 文件时,文件系统代码将文件从磁盘加载到缓存中;当您稍后再次 grep 时,它还没来得及从缓存中过期。看看是否有办法手动刷新文件系统缓存,然后比较前后时间。 (2认同)

小智 19

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

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

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

  • 如果您正在执行递归 grep,则 inode 和 dentry 缓存会产生显着差异。在测试中,`/usr/include` 中的 grep 在我的系统上花费了大约 16.4 秒,所有缓存都被丢弃了。缓存所有内容后,大约 0.3 秒。如果我只删除页面缓存(保存缓冲区缓存),则需要大约 14.3 秒。如果我离开页面缓存并删除 dentry/inode 缓存,大约需要 12 秒。 (5认同)