perl 执行效率,如何提高.

nihaoyj80 2011-11-02 12:44:09
代码:1 按理说应该比正则运行的效率更快呀..
sub format_line{
my $line = shift;
return unless ($line);

my $char = ' ';
my $offset = 0;
my @line_arr;
my ($ip,$time,$url,$status,$size);

my $result = index($line,$char,$offset);

while ($result != -1){
push(@line_arr,$result);

$offset = $result + 1;
$result = index($line,$char,$offset);

}

my $ip_end = $line_arr[0];
my $ip = substr($line,0,$ip_end);

my $time_start = $line_arr[2] + 1;
my $time_end = $line_arr[3] - $time_start;
my $time = substr($line,$time_start,$time_end);
$time = str2stamp($time,$log_tm_fmt);

my $url_start = $line_arr[5] + 1;
my $url_end = $line_arr[6] - $url_start;
my $url = substr($line,$url_start,$url_end);

my $status_start = $line_arr[7] + 1;
my $status_end = $line_arr[8] - $status_start;
my $status = substr($line,$status_start,$status_end);

my $size_start = $line_arr[8] + 1;
my $size_end = $line_arr[9] - $size_start;
my $size = substr($line,$size_start,$size_end);

my $time = $time - ($time % 300);
$hour{$time} += $size;
return ($ip,$time,$url,$status,$size);
}

以上代码处理390M日志文件,耗时,57秒.

使用正则代码:

my $line_fmt    = "^([^ ]+) [^ ]+ [^ ]+ \\[([^ ]+) [^ ]+\\] \\\"[^ ]+ [^ ]+ HTTP/1\.[0|1]?\\\" ([\\d]+) ([\\d]+).*";
my %hour;

while (<>){
chomp;
my $line = $_;
my @line = map(/$line_fmt/,$line);
my $ip = $line[0]; # ipadress
next if (($ip eq '127.0.0.1') || ($ip =~ /^192\.168\.\d{1,3}\.\d{1,3}/));
my $status = $line[2];
next if ($status =~ /^(40|30|50)/);
my $timestr = str2stamp(substr($line[1],1),$log_tm_fmt);
my $size = $line[3];

my $time = $timestr - ($timestr % 300);
$hour{$time} += $size;
}

处理390M日志文件耗时,40秒.

麻烦高手们,看看怎么优化一下.

日志格式,
122.77.179.249 - - [31/Oct/2011:00:02:37 +0800] "GET http://flv1.jstv.com/feichengwr/201110/fcwr20111022_1.flv HTTP/1.1" 200 4805478 "http://jayce.com" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1"
...全文
279 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nihaoyj80 2011-11-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fibbery 的回复:]

日志格式能改吗?提高解析的效率,最高提高被解析内容的可解析度!
[/Quote]

格式,改的可能性不大..最原始的就是这个,不过可以考虑,2次处理了..
foolbirdflyfirst 2011-11-03
  • 打赏
  • 举报
回复
这是apache的访问日志吧?
fibbery 2011-11-02
  • 打赏
  • 举报
回复
日志格式能改吗?提高解析的效率,最高提高被解析内容的可解析度!
fibbery 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 nihaoyj80 的回复:]
同意你的说法呐..
自己写的东西,肯定都想优化的更快...

C快,但是估计还想让它再快..
[/Quote]

是,呵呵,有时候我也是,有时间的时候我也会考虑。
nihaoyj80 2011-11-02
  • 打赏
  • 举报
回复
同意你的说法呐..
自己写的东西,肯定都想优化的更快...

C快,但是估计还想让它再快..
proorck6 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fibbery 的回复:]
要是觉得效率低,你就用C来写吧。我觉得效率,满足要求就行,更珍贵的是人的开发效率。
[/Quote]++
fibbery 2011-11-02
  • 打赏
  • 举报
回复
要是觉得效率低,你就用C来写吧。我觉得效率,满足要求就行,更珍贵的是人的开发效率。

37,742

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧