为什么LWP :: Simple ::会降低后续正则表达式的速度?

时间:2018-03-30 15:52:42

标签: regex perl lwp-useragent

使用字符串上的perl正则表达式进行基准测试时

如果我使用shell调用获取字符串,那么效果很好。 但如果我使用LWP :: Simple,后续正则表达式会变慢 使用lwp,正则表达式需要13秒,wget工作时小于4s

为什么?

#!/usr/bin/perl                                                                                                                                                                                      
use Time::HiRes qw( gettimeofday tv_interval );
use strict;
my %data;

$data{'TO'} = "rcpt";
$data{'MESSAGE_ID'} = "37";
$data{'ID'} = "7";
$data{'UNIQID'} = "cff47534-fe6b-c45a-7058-8301adf1b97";
$data{'XOR'} = "abcdef";

my $url = "http://raw.githubusercontent.com/ramprasadp/hostedtexfiles/master/msg2.txt";

#
# This makes the rest of the program very slow LWP::Simple
#
my $msg_string = LWP::Simple::get($url);                  


# While this works great                                                                                                                                                              
#my $msg_string = `wget -q -O - $url`;

my $start = [gettimeofday];
for (my $j=0;$j<50000; $j++) {
    my $tmp_string = $msg_string;
    $tmp_string =~ s/\$\{ (\w+) \}/$data{$1}/g;
}
print "Time taken in ms is " . 1000 * tv_interval ( $start )."\n";

1 个答案:

答案 0 :(得分:3)

它很快,因为它错了。您在此处使用替换运算符s///来处理文本字符串。 get生成一个文本字符串,这样就可以了。 `wget …`生成八位字节的缓冲区。尽管如此,你的替换操作恰好显示了正确的结果,但这是由于运气和巧合,并且在一般情况下不起作用。当具有高代码点的字符发挥作用时,它可能会中断,并且您在八位字节级别上意外地替换了它们的一部分。

您可以使用Encodeget文本字符串编码为八位字节来验证我说的是真的,并且结果将是快速和错误的,或者将`wget …`八位字节解码为一个文本字符串,两个结果都是正确和缓慢的。

阅读https://p3rl.org/UNI以了解相关主题。