Answers:
它通常与页面缓存有关。
第一次,必须从磁盘上(物理地)读取数据。
第二次(对于不太大的文件)可能位于页面缓存中。
因此,您可以先发出类似cat(1)的命令,将(不是太大)文件放入页面缓存(即在RAM中),然后发出第二个grep(1)(或任何读取文件的程序) 。
(但是,有时仍需要从磁盘读取数据)
另请参阅(有时在您的应用程序中有用,但实际上很少)readahead(2)和posix_fadvise(2)以及madvise(2)&sync(2)和fsync(2)等。
另请阅读LinuxAteMyRAM。
顺便说一句,这就是为什么在对程序进行基准测试时建议多次运行它的原因。同样,这就是为什么购买更多内存可能有用的原因(即使您没有运行将所有内存用于其数据的程序)。
如果您想了解更多,请阅读《操作系统:三篇简单的书》之类的书。
cat
+ grep
仍然比grep
单独花费更长的时间。
cat
在执行其他操作时使用多线程并将其用作廉价的预取,否则请准备grep
感兴趣的内容。
cat
以tac
获得相同的效果和更高的RAM使用率:D或用tac替换所有的猫
在网络存储环境中,当您首次访问与服务器分开的“文件管理器”中驻留的文件时,也会有相对较大的延迟。一旦在服务器上访问了该文件,该文件将被本地缓存,随后对数据的访问将更快。
这是一个仅计算文件数据校验和的实验,而不是grep。第一次调用很慢,随后的调用很快。
> du -Dh file_348m
348M file_348m
> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462 file_348m
0.60user 0.15system 0:03.02elapsed 25%CPU (0avgtext+0avgdata 1524maxresident)k
708144inputs+0outputs (0major+80minor)pagefaults 0swaps
> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462 file_348m
0.67user 0.06system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps
> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462 file_348m
0.65user 0.07system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps
> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462 file_348m
0.66user 0.06system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps
TL;DR
答案是“ [块等待] I / O”。