分页: 1 / 2

grep的效率为啥这么高?

发表于 : 2011-09-12 11:02
centerpoint

代码: 全选

用grep 查询"23:23:15.039330"这个字符串.这个字符串在文件的后半部分.
# time grep 23:23:15.039330 tcpdump_log.txt 
2011-08-30 23:23:15.039330 IP 218.61.0.144.19991

real    0m0.846s
user    0m0.627s
sys 0m0.219s
文件大小:
#ls -sh tcpdump_log.txt 
747M tcpdump_log.txt

但是我感觉0.8秒连文件也读不完啊

代码: 全选

确实连文件也读不完: 
# time cat tcpdump_log_2011-09_1.txt > /dev/null 

real	0m7.197s
user	0m0.019s
sys	0m0.408s
# ls -sh tcpdump_log_2011-09_1.txt 
642M tcpdump_log_2011-09_1.txt
# tail -n 1 tcpdump_log_2011-09_1.txt
2011-09-12 16:23:58.960353 IP 111.174.44.10.nfa > .cp-cluster: P 3818663732:3818663764(32) ack 349885517 win 63880
# time grep 16:23:58.960353 tcpdump_log_2011-09_1.txt
2011-09-12 16:23:58.960353 IP 111.174.44.10.nfa > .cp-cluster: P 3818663732:3818663764(32) ack 349885517 win 63880

real	0m0.830s
user	0m0.509s
sys	0m0.318s
# 

看到没? grep虽快,但是硬盘速度有限制啊, cat 读完642M的文件要7秒.grep居然0.8秒就查询完毕.
因为grep是必须读完全部文件才能对比匹配所有行的所有字符串.
为嘛?

Re: grep的效率为啥这么高?

发表于 : 2011-09-12 11:04
我就是我2
centerpoint 写了:

代码: 全选

用grep 查询"23:23:15.039330"这个字符串.这个字符串在文件的后半部分.
# time grep 23:23:15.039330 tcpdump_log.txt 
2011-08-30 23:23:15.039330 IP 218.61.0.144.19991

real    0m0.846s
user    0m0.627s
sys 0m0.219s
文件大小:
#ls -sh tcpdump_log.txt 
747M tcpdump_log.txt
高和低是一对概念。grep和谁比才显示出它的高呢? :em03

Re: grep的效率为啥这么高?

发表于 : 2011-09-12 11:11
xhy
纯内存操作不到1GB的数据,而且还没有正则,当然花不了多少时间.

Re: grep的效率为啥这么高?

发表于 : 2011-09-12 12:11
tusooa
你拿time cat比较下。

Re: grep的效率为啥这么高?

发表于 : 2011-09-12 16:11
eexpress
0.8秒连文件也读不完
你啥思维。
0.01秒,cairo都可以渲染整个屏幕100次了。

Re: grep的效率为啥这么高?

发表于 : 2011-09-12 16:46
sk1418
ack不是号称比grep快,应尬把所有用grep 的换成ack么。 LZ试试,ack有多快被。

Re: grep的效率为啥这么高?

发表于 : 2011-09-20 12:43
Methuselar

Re: grep的效率为啥这么高?

发表于 : 2011-09-23 20:09
centerpoint
7楼非常精准的引用,完全解答了我的疑问.7楼的朋友博文广见,非常感谢

Re: grep的效率为啥这么高?

发表于 : 2011-09-26 16:27
lilydjwg
关爱那些不会e文的童鞋,我来发个中文版: http://heikezhi.com/2011/08/18/why-gnu-grep-is-fast/

Re: grep的效率为啥这么高?

发表于 : 2011-10-10 8:09
fnan
#a.txt是个五十万行的文件。
kose5@kose5-Aspire-4552:~$ time sed -n '/[0-9][a-z][0-9]/p' a.txt|wc -l
43155

real 0m1.158s
user 0m1.110s
sys 0m0.070s
kose5@kose5-Aspire-4552:~$ time perl -ne 'if (/\d[a-z]\d/) {print}' a.txt|wc -l
43155

real 0m0.537s
user 0m0.540s
sys 0m0.020s
kose5@kose5-Aspire-4552:~$ time grep -c '[0-9][a-z][0-9]' a.txt
79278 (汗,不仅慢,还是错误的)

real 1m8.299s
user 1m8.170s
sys 0m0.020s
kose5@kose5-Aspire-4552:~$ time grep -Pc '[0-9][a-z][0-9]' a.txt
43155 (perl正则。。。没话说)

real 0m0.301s
user 0m0.280s
sys 0m0.010s
kose5@kose5-Aspire-4552:~$ time awk '$0~/[0-9][a-z][0-9]/ {print}' a.txt|wc -l
43155

real 0m0.224s (awk的速度!!!!!)
user 0m0.230s
sys 0m0.020s
kose5@kose5-Aspire-4552:~$

Re: grep的效率为啥这么高?

发表于 : 2011-10-10 12:12
lilydjwg
fnan 写了:#a.txt是个五十万行的文件。
[...]
kose5@kose5-Aspire-4552:~$ time grep -c '[0-9][a-z][0-9]' a.txt
79278 (汗,不仅慢,还是错误的)

real 1m8.299s
user 1m8.170s
sys 0m0.020s
[...]
你用了 -c,所以 grep 的优化策略不起作用了。至于为什么结果不对,我也很想知道。

Re: grep的效率为啥这么高?

发表于 : 2011-10-10 12:23
nmsfan
让程序变得更快的关键就是让它们做更少的事情,:)

Re: grep的效率为啥这么高?

发表于 : 2011-10-10 20:11
fnan
kose5@kose5-Aspire-4552:~$ time grep '[0-9][a-z][0-9]' a.txt|wc -l
79278

real 1m13.000s
user 1m12.900s
sys 0m0.080s
kose5@kose5-Aspire-4552:~$
# 结果一样(更糟?),其实-c所用时间非常少。

Re: grep的效率为啥这么高?

发表于 : 2011-10-10 20:15
fnan
lilydjwg 写了:
fnan 写了:#a.txt是个五十万行的文件。
[...]
kose5@kose5-Aspire-4552:~$ time grep -c '[0-9][a-z][0-9]' a.txt
79278 (汗,不仅慢,还是错误的)

real 1m8.299s
user 1m8.170s
sys 0m0.020s
[...]
你用了 -c,所以 grep 的优化策略不起作用了。至于为什么结果不对,我也很想知道。
#不知道优化算法有没有经过严格测试?(这速度叫优化?)

Re: grep的效率为啥这么高?

发表于 : 2011-10-10 20:34
lilydjwg
fnan 写了:kose5@kose5-Aspire-4552:~$ time grep '[0-9][a-z][0-9]' a.txt|wc -l
79278

real 1m13.000s
user 1m12.900s
sys 0m0.080s
kose5@kose5-Aspire-4552:~$
# 结果一样(更糟?),其实-c所用时间非常少。
结果当然会更糟——少了个计数器,但要将匹配行输出,断行还是不能避免。也许那个优化算法只能对 -q 这种选项有效了。。。