在查找与 的匹配项时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 用于数据的程序)。
如果您想了解更多,请阅读一些书,例如操作系统:三个简单的部分