当 grep 不运行 CPU 时,它会做什么?

Ale*_*lex 19 performance grep

在查找与 的匹配项时grep,我经常注意到后续搜索所需的时间明显少于第一次——例如 25 秒与 2 秒。显然,它不是通过重用上次运行的数据结构——那些应该已经被释放的。在 上运行time命令grep,我注意到一个有趣的现象:

real    24m36.561s
user    1m20.080s
sys     0m7.230s
Run Code Online (Sandbox Code Playgroud)

剩下的时间去哪儿了?有什么我可以做的让它每次都跑得快吗?(例如,在grep搜索文件之前让另一个进程读取文件。)

Bas*_*tch 34

它通常与页面缓存有关

第一次,必须从磁盘读取(物理)数据。

第二次(对于不太大的文件)它可能位于页面缓存中。

因此,您可以先发出类似cat(1)的命令将(不太大的)文件放入页面缓存(即在 RAM 中),然后第二个grep(1)(或任何读取文件的程序)通常会运行得更快.

(不过,有时还是需要从磁盘中读取数据)

另请参阅(有时在您的应用程序中很有用,但实际上很少)readahead(2) & posix_fadvise(2)以及madvise(2) & sync(2) & fsync(2)等....

阅读LinuxAteMyRAM

顺便说一句,这就是为什么在对程序进行基准测试时建议多次运行它的原因。此外,这就是为什么购买更多 RAM 可能会很有用的原因(即使您没有运行将所有 RAM 用于数据的程序)。

如果您想了解更多,请阅读一些书,例如操作系统:三个简单的部分

  • 因此,`TL;DR` 的答案是“[block waiting for] I/O”。 (12认同)
  • @PaulDraper 不是真的:) `cat` + `grep` 仍然比单独使用 `grep` 需要更长的时间。 (10认同)
  • @chepner 除非你可以多线程并在你做其他事情时使用 `cat` 作为廉价的预取,为感兴趣的 `grep` 做准备。 (3认同)
  • @G-Man:你也可以用 `tac` 替换两个 `cat`,以获得相同的效果和更高的 RAM 使用:D 或者所有的猫都用 tac (3认同)
  • @MarkKCowan:[可爱的猫!](http://montypython.net/scripts/spam.php) :-) ⁠ (2认同)