为什么 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 …` 产生八位字节缓冲区。尽管如此,您的替换操作恰好显示了正确的结果,但那只是运气和巧合,在一般情况下是行不通的。当具有高代码点的字符开始发挥作用时,它可能会中断,并且您不小心在八位位组级别替换了它们的一部分。

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

阅读 https://p3rl.org/UNI 以了解该主题的介绍。