免费注册 查看新帖 |

Chinaunix

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

对文件(列表)的查询及效率问题,请各位讨论下(暂时解决) [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-06-16 10:54 |只看该作者
原帖由 yashiro_lj 于 2009-6-16 10:48 发表
你这样写就等于循环了2次(一次用于检查incorrect,一次用于检查OK),效率上估计还比不上只while循环一次呢。

my @list=grep /Login OK/,;
这样写会把整个当做一个列表一次性都读入内存的,如果文件过大, ...






my @list=grep /Login OK/,<FILE>;

这个还是太危险了。我想也是我终于的新手最容易犯的错误。

记住了,用while最保险!  foreach 和 以上代码要切忌!!

谢谢!

论坛徽章:
0
22 [报告]
发表于 2009-06-16 11:09 |只看该作者
  1. use strict;
  2. use warnings;
  3. use Benchmark;

  4. timethese( 1000000, {
  5.      '1' => q!   
  6.         my $OK;
  7.         my $wrong;
  8.         while(<DATA>) {
  9.             if(/Login incorrect/) {
  10.             $wrong++;
  11.             next;
  12.         }
  13.         $OK++ if /Login OK/;
  14.     }!,

  15.     '2' => q!
  16.         my $OK;
  17.         my $wrong;
  18.         while(<DATA>) {
  19.             index($_, 'Login incorrect') > 1 ? $wrong++ : index($_, 'Login OK') > 1 ? $OK++ : {};
  20.         } !
  21. });
  22. __DATA__
  23. Thu Jan 15 10:02:10 2009 : Auth: Login incorrect: [ac/d] (from client)
  24. Thu Jan 15 10:02:12 2009 : Error: Username [ac] Reject Message
  25. Thu Jan 15 10:02:12 2009 : Auth: Login incorrect: [ac/b] (from client)
  26. Thu Jan 15 10:02:15 2009 : Auth: Login OK: [ab/c] (from client)
复制代码


楼主可以试试这段代码,在我的机器上跑(XP),index的方式比正则还是要快一些的

不好意思,之前DATA的数据有误,统计出来的$wong和$OK不对,现在换成楼主提供的数据

[ 本帖最后由 yashiro_lj 于 2009-6-16 11:14 编辑 ]

论坛徽章:
0
23 [报告]
发表于 2009-06-16 12:05 |只看该作者

回复 #22 yashiro_lj 的帖子

谢谢!
Benchmark还要再仔细学习一下。


但你这个代码的目的是做什么呢?看起来我有点儿晕。为什么要执行2个WHILE呢?

论坛徽章:
0
24 [报告]
发表于 2009-06-16 12:08 |只看该作者

回复 #23 gaochong 的帖子

这是Benchmark的timethese,意思就是分别执行这两段代码(正则版本和index版本)1000000次,然后输出一些性能指标,你看看Benchmark就明白了

论坛徽章:
0
25 [报告]
发表于 2009-06-16 12:10 |只看该作者

回复 #24 yashiro_lj 的帖子

奥,明白了。

你是做正则版本和index版本的比较。

太谢谢了,这个好,比我比较时间更有说服力,我试试看。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
26 [报告]
发表于 2009-06-16 12:27 |只看该作者
原帖由 yashiro_lj 于 2009-6-16 11:09 发表
use strict;
use warnings;
use Benchmark;

楼主可以试试这段代码,在我的机器上跑(XP),index的方式比正则还是要快一些的

你这样每次都从 DATA 读数据,那么只有第一次循环能读到数据,其他的循环根本就读不到数据。

论坛徽章:
0
27 [报告]
发表于 2009-06-16 12:47 |只看该作者

回复 #26 MMMIX 的帖子

我想也是这样的,因为第一次循环已经到了最末了。但执行结果好像不是这样

执行结果如下:
-bash-3.00$ ./4.pl
Benchmark: timing 1000000 iterations of 1, 2...
         1:  9 wallclock secs ( 6.09 usr +  3.04 sys =  9.13 CPU) @ 109529.03/s (n=1000000)
Useless use of single ref constructor in void context at (eval 6) line 5, <DATA> line 43.
         2:  9 wallclock secs ( 6.11 usr +  3.04 sys =  9.15 CPU) @ 109289.62/s (n=1000000)


<DATA> line 43 是最后一行,不知道如何修复这个告警。

另外,109529.03/s 这是运算能力吗?如果是运算能力,那正则还是更优的。而且负载相对也低。

论坛徽章:
0
28 [报告]
发表于 2009-06-16 12:54 |只看该作者
原帖由 MMMIX 于 2009-6-16 12:27 发表

你这样每次都从 DATA 读数据,那么只有第一次循环能读到数据,其他的循环根本就读不到数据。

检查了一下,确实如此!查阅了Benchmark的timethese等一些说明,没有找到相关的介绍,请教MMMIX是怎么发现这个问题的?

论坛徽章:
0
29 [报告]
发表于 2009-06-16 12:58 |只看该作者

回复 #28 yashiro_lj 的帖子

你是怎样“确实如此”的呢?我无法验证。


但我想,第一次循环后,就到了最末了,下次循环时就马上结束了。

论坛徽章:
0
30 [报告]
发表于 2009-06-16 13:38 |只看该作者

回复 #29 gaochong 的帖子

在while循环中加print $_, "\n";,可以看到,只打印了一次DATA中所有行,而不是循环的打印,说明只通读了一次DATA,下次循环没有从头开始读DATA

你说的对,第一次循环之后确实是到最末了,我以为timethese会恢复DATA的初始状态,从新再开始一轮读数据,看来不经验证的想当然靠不住啊

我比较好奇的是MMMIX怎么知道会有这个问题的?望赐教
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP