为什么 LWP::Simple::get 会减慢后续的正则表达式?
Why does LWP::Simple::get slow down a subsequent regular expression?
在字符串上使用 perl 正则表达式进行基准测试时
如果我使用 shell 调用获取字符串,效果很好。
但是如果我使用 LWP::Simple 后续的正则表达式会变慢
使用 lwp,正则表达式需要 13 秒,使用 wget,它的工作时间小于 4 秒
为什么?
#!/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{}/g;
}
print "Time taken in ms is " . 1000 * tv_interval ( $start )."\n";
因为错所以快。您在此处使用替换运算符 s///
来处理文本字符串。 get
生成一个文本字符串,所以没关系。 `wget …`
产生八位字节缓冲区。尽管如此,您的替换操作恰好显示了正确的结果,但那只是运气和巧合,在一般情况下是行不通的。当具有高代码点的字符开始发挥作用时,它可能会中断,并且您不小心在八位位组级别替换了它们的一部分。
您可以通过使用 Encode 将 get
文本字符串编码为八位字节来验证我所说的是真的,并且两种结果都将是快速且错误的,或者解码 `wget …`
将八位字节转换为文本字符串,这两个结果都是正确且缓慢的。
阅读 https://p3rl.org/UNI 以了解该主题的介绍。
在字符串上使用 perl 正则表达式进行基准测试时
如果我使用 shell 调用获取字符串,效果很好。 但是如果我使用 LWP::Simple 后续的正则表达式会变慢 使用 lwp,正则表达式需要 13 秒,使用 wget,它的工作时间小于 4 秒
为什么?
#!/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{}/g;
}
print "Time taken in ms is " . 1000 * tv_interval ( $start )."\n";
因为错所以快。您在此处使用替换运算符 s///
来处理文本字符串。 get
生成一个文本字符串,所以没关系。 `wget …`
产生八位字节缓冲区。尽管如此,您的替换操作恰好显示了正确的结果,但那只是运气和巧合,在一般情况下是行不通的。当具有高代码点的字符开始发挥作用时,它可能会中断,并且您不小心在八位位组级别替换了它们的一部分。
您可以通过使用 Encode 将 get
文本字符串编码为八位字节来验证我所说的是真的,并且两种结果都将是快速且错误的,或者解码 `wget …`
将八位字节转换为文本字符串,这两个结果都是正确且缓慢的。
阅读 https://p3rl.org/UNI 以了解该主题的介绍。