当查找 的匹配项时grep
,我经常注意到后续搜索所需的时间明显少于第一次,例如 25 秒与 2 秒。显然,这不是通过重用上次运行的数据结构——那些应该被释放的。time
在 上运行命令grep
,我注意到一个有趣的现象:
real 24m36.561s
user 1m20.080s
sys 0m7.230s
剩下的时间都去哪儿了?有什么办法可以让它每次都跑得快吗? (例如,在grep
搜索文件之前让另一个进程读取文件。)
答案1
它常常与页面缓存。
第一次,必须从磁盘(物理)读取数据。
第二次(对于不太大的文件)它可能位于页面缓存中。
所以你可以先发出这样的命令猫(1)将(不太大的)文件放入页面缓存(即 RAM 中),然后第二个正则表达式(1)(或任何读取该文件的程序)通常会运行得更快。
(但是有时候还是需要从磁盘读取数据)
另请参阅(有时在您的应用程序中有用,但实际上很少)预读(2)&posix_fadvise(2)也许疯狂的维斯(2)&同步(2)&同步(2)ETC....
另请阅读LinuxAteMyRAM。
顺便说一句,这就是为什么建议在对程序进行基准测试时多次运行它。此外,这就是为什么购买更多 RAM 可能很有用(即使您运行的程序不使用所有 RAM 来存储数据)。
如果你想了解更多,请阅读一些书,例如操作系统:三个简单的部分
答案2
在网络存储环境中,当您首次访问驻留在与服务器分离的“文件管理器”上的文件时,也可能会出现相对较大的延迟。一旦在服务器上访问该文件,它将被缓存在本地,并且后续对数据的访问将会快得多。
这是一个仅计算文件数据校验和的实验——而不是 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