|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
对于linux命令,一定要学会用man和info去查他们的解释;
编注:这是GNUgrep的原作者MikeHaertel在FreeBSD邮件列表中对“GNUgrep为何比BSDgrep要快”所做的回覆,上面是邮件注释内容:
Gabor您好,
我是GNUgrep的原作者,同时也是一位FreeBSD用户,不外我一向利用的是-stable版本(也就是更老的版本),而没怎样存眷-current版本。
可是,当我偶然间翻阅-current版的邮件列表时,偶尔发明了一些关于BSDgrep与GNUgrep功能的会商,你大概也注重到了那些会商。
不论怎样说,仅供参考吧,上面是一些复杂的总结,关于为何GNUgrep云云之快。也许你能自创个中的一些头脑使用到BSDgrep中往。
#技能1:GNUgrep之以是快是由于它并不会往反省输出中的每个字节。
#技能2:GNUgrep之以是快是由于它对那些切实其实必要反省的每一个字节都实行十分少的指令(操纵)。
GNUgrep利用了十分出名的Boyer-Moore算法(译者注:BM算法,是一种十分高效的字符串搜刮算法,一样平常情形下,比KMP算法快3-5倍,详细可检察这篇解说十分具体的文章:grep之字符串搜刮算法Boyer-Moore由浅进深(比KMP快3-5倍)),该算法起首从方针字符串的最初一个字符入手下手查找,而且利用一个查找表,它能够在发明一个不婚配字符以后,盘算出能够跳过量少个输出字符并持续查找。
GNUgrep还睁开了Boyer-Moore算法的外部轮回,并创建了一个Boyer-Moore的delta表,如许它就不必要在每个睁开的步骤举行轮回加入判别了。如许的了局就是,在极限情形下(inthelimit),GNUgrep在必要反省的每个输出字节上所实行的x86指令不会凌驾3条(而且还跳过了很多字节)。
你能够看看由AndrewHume和DanielSunday1991年11月在“SoftwarePractice&Experience”上宣布的论文“FastStringSearching”,该文很好的会商了Boyer-Moore算法的完成技能,该文有收费的PDF在线版(译者注:点这里检察或下载)。
一旦有了疾速搜刮,这时候你会发明也必要一样疾速的输出。
GNUgrep利用了原生Unix输出体系挪用并制止了在读取后对数据举行拷贝。
并且,GNUgrep还制止了对输出举行分行,查找换行符会让grep减慢好几倍,由于要找换行符你就必需检察每一个字节!
以是GNUgrep没有利用基于行的输出,而是将原数据读进到一个年夜的缓冲区buffer,用Boyer-Moore算法对这个缓冲区举行搜刮,只要在发明一个婚配以后才会往查找比来的换行符(某些命令参数,好比-n会克制这类优化)。
最初,当我还在保护GNUgrep的时分(15+年前……),GNUgrep也实验做一些十分坚苦的事变使内核也能制止处置输出的每一个字节,好比利用mmap()而不是read()来举行文件输出。事先,用read()会使年夜部分Unix版本形成一些分外的拷贝。由于我已不再GNUgrep了,以是仿佛mmap已不再默许利用了,可是你仍旧能够经由过程参数–mmap来启用它,最少在文件体系的buffer已缓存了你的数据的情形下,mmap仍旧要快一些:
1
2
3
4
5
6
7
8
$timesh-cfind.-typef-print|xargsgrep-l123456789abcdef
real0m1.530s
user0m0.230s
sys0m1.357s
$timesh-cfind.-typef-print|xargsgrep--mmap-l123456789abcdef
real0m1.201s
user0m0.330s
sys0m0.929s
[这里利用的输出是一个648M的MH邮件文件夹,包括约莫41000条信息]
以是即便在明天,利用–mmap仍旧能够提速20%以上。
总结:
-利用Boyer-Moore算法(而且睁开它的内层轮回)。
不同版本的Linux命令数量不一样,这里笔者把它们中比较重要的和使用频率最多的命令。 |
|