使用字符串上的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";
答案 0 :(得分:3)
它很快,因为它错了。您在此处使用替换运算符s///
来处理文本字符串。 get
生成一个文本字符串,这样就可以了。 `wget …`
生成八位字节的缓冲区。尽管如此,你的替换操作恰好显示了正确的结果,但这是由于运气和巧合,并且在一般情况下不起作用。当具有高代码点的字符发挥作用时,它可能会中断,并且您在八位字节级别上意外地替换了它们的一部分。
您可以使用Encode将get
文本字符串编码为八位字节来验证我说的是真的,并且结果将是快速和错误的,或者将`wget …`
八位字节解码为一个文本字符串,两个结果都是正确和缓慢的。
阅读https://p3rl.org/UNI以了解相关主题。