分页: 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和谁比才显示出它的高呢?

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
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 这种选项有效了。。。