免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: chenryn
打印 上一主题 下一主题

perl脚本占用资源比较大,怎么找原因呢? [复制链接]

论坛徽章:
0
1 [报告]
发表于 2010-05-09 09:24 |显示全部楼层
回复 6# Osment

没有oi,但是人家有qr。

并且,i跟你说的性能上不仅仅没有优化,理论上应该更慢。i是ignore case sensitiive。
o才是只编译正则一次。

论坛徽章:
0
2 [报告]
发表于 2010-05-09 09:38 |显示全部楼层
  1. 1273144492.670      9 121.14.225.183 TCP_IMS_HIT/304 236 GET http://www.ggv.com.cn/downfiles/20070815_135941_1.rar  - NONE/- text/plain "http://down.ggv.com.cn/down/cnt_n_down.php?id=698400&flag=1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
  2. 脚本里相关部分是:
  3. my $log_pattern   = qr '^.*?\d+\s+\w+\s+(http:\/\/.+?)\s+.+';
复制代码
没有什么想不明白的。正则表达式只是为了写得尽可能准确。越准确正则引擎需要做的猜测类工作越少,性能相对越好。
正则分解如下:
/
^.*? # 前面那些
\d+  # 上面的236
\s+  # 空白
\w+  # GET
\s+  # 空白
(http:\/\/.+?) # url
\s+ # 空白
.+  # 后面剩余的
/
这个正则不一定非要这样写,但目的只有两个:
1. 能够匹配,这是做这件事的根本目的,
2. 严谨,如果使用split速度肯定更快,但是如果日志里有不完整或者残缺或者不准确的日志的话,split将出问题,而且直接使用split (//, @list)[7]可能会被perl报一个uninitialized value的错误信息;
3. 正则写的相对完整,完整意味着“描述上没有含糊不清,更精确”,体现了2的严谨,也能提高速度。否则直接写个:
^.*?http:\/\/.+\s+.+就能匹配出来了,但速度上你可以测试下。

但是这个正则前面的.*?可以进行进一步优化。因为这样正则引擎在匹配的时候可能需要做的步骤是:
因为加了非贪婪的?,首先匹配:
将.*?当成空白跟后面的正则加在一起,看能否匹配成功,如果匹配失败,则:
将.*?当成一个字符,进行匹配,如果匹配失败,则:
再向右读取一个字符再匹配,循环,一直到匹配成功为止。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP