如何准确计时grep命令?


9

我想比较这两个命令的速度:

grep pattern1 files* 
grep pattern2 files* 

不幸的是,第一个grep将大量文件*读入内存缓冲区,因此第二个grep运行得非常快,但是原因有误。

我如何告诉Linux(Fedora 11):“请停止缓存磁盘读取,因为我正在测试某些东西。”


可能有一个更聪明的答案...但是您可以复制目录结构,这样就不会处理相同的文件,也不会出现缓存问题!
nico

1
顺便说一句:Fedora 11于2010年6月停产。是时候进行升级了。即将发布的Fedora 15版本看起来非常不错。或者,如果您需要在更长的寿命的东西更稳定(这听起来像你可能会因为你还在11),有RHEL6或任何一天,现在的CentOS 6
mattdm

我花了永远的时间从RH 7.3升级到那个!升级会破坏事情并使我恐惧。
barrycarter 2011年

2
通过关闭缓存,您可以确定基准不是模式匹配的速度,而是驱动器的速度。就像其他人建议的那样-只需运行第一个命令两次即可:第一个启动缓存,第二个进入基准测试。
alex

我会尝试的,但是我的主要问题是磁盘速度...运行grep时,硬盘驱动器变硬了。嗯,好的,所以这可能意味着优化grep可能根本无济于事...我需要优化我要提取的数据量。
barrycarter 2011年

Answers:


11

我认为您不能轻易地说出“暂时停止缓存”。但是您可以做的是告诉系统在每次运行之前删除缓存:

作为根:

sync; echo 3 > /proc/sys/vm/drop_caches

(这已记录在Documentation / sysctl / vm.txt的内核文档中,这很方便,如果像我们中的某些人一样,您不总是记住这些值1、2或3的含义。)

或者,当然也可以替换为缓存并比较缓存的性能。(我认为两者都是有用的数字。)


1
echo 1只会删除页面缓存,不会删除任何磁盘缓存。
jsbillings 2011年

@jsbillings-嗯,是的。固定。
mattdm 2011年

令人难以置信的小挑剔:我必须做“ >>”,而不是“>”
barrycarter 2011年

@barrycarter:真的吗?!!
mattdm 2011年

3
@barrycarter:您可能已在外壳中设置了-o noclobber,这使其无法使用>覆盖现有文件。
jsbillings 2011年

1

在计时这样的事情时,我通常会先运行它以准备缓存。然后使用时间运行命令。在进行类似这样的测试时,您应该更多地关注CPU和运行时间,而不要关注I / O时间。

无论如何,很难获得完全准确的时序。如果输入文件超出了缓冲区可用的内存大小,那么您可能最终将所有文件循环通过缓冲区高速缓存。否则,您可能只访问缓冲区缓存中的所有数据。在现实生活中,缓冲数据和从磁盘读取的数据经常混合在一起。


IRL,我仅偶尔运行此命令,因此永远不会缓存文件*的内容。我正在尝试优化grep以在这种情况下快速运行。当文件*内容已经在高速缓存中时,它会在一秒钟内运行(由于输出是针对最终用户的,因此没有必要进行优化)
barrycarter 2011年

2
@barrycarter。如果文件没有被缓存,并且它们在不到一秒钟的时间内运行,那么我认为您不会找到很多优化的机会。将文件移动到更快的存储将是可能的优化。
BillThor 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.