有新的智能匹配运算符:
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
my @x = (1, 2, 3);
my @y = qw(1 2 3);
say "[@x] and [@y] match" if @x ~~ @y;
关于Array::Compare:
在内部,比较器通过使用 join 将两个数组转换为字符串并使用 比较字符串来比较两个数组eq
。
我想这是一个有效的方法,但只要我们使用字符串比较,我宁愿使用类似的东西:
#!/usr/bin/perl
use strict;
use warnings;
use List::AllUtils qw( each_arrayref );
my @x = qw(1 2 3);
my @y = (1, 2, 3);
print "[@x] and [@y] match\n" if elementwise_eq( \(@x, @y) );
sub elementwise_eq {
my ($xref, $yref) = @_;
return unless @$xref == @$yref;
my $it = each_arrayref($xref, $yref);
while ( my ($x, $y) = $it->() ) {
return unless $x eq $y;
}
return 1;
}
如果您要比较的数组很大,加入它们会做大量工作并消耗大量内存,而不仅仅是逐个比较每个元素。
更新:当然,应该测试这样的陈述。简单的基准:
#!/usr/bin/perl
use strict;
use warnings;
use Array::Compare;
use Benchmark qw( cmpthese );
use List::AllUtils qw( each_arrayref );
my @x = 1 .. 1_000;
my @y = map { "$_" } 1 .. 1_000;
my $comp = Array::Compare->new;
cmpthese -5, {
iterator => sub { my $r = elementwise_eq(\(@x, @y)) },
array_comp => sub { my $r = $comp->compare(\(@x, @y)) },
};
这是最坏的情况,elementwise_eq
必须遍历两个数组中的每个元素 1_000 次,它显示:
速率迭代器 array_comp
迭代器 246/s -- -75%
array_comp 1002/s 308% --
另一方面,最好的情况是:
my @x = map { rand } 1 .. 1_000;
my @y = map { rand } 1 .. 1_000;
速率 array_comp 迭代器
array_comp 919/s -- -98%
迭代器 52600/s 5622% --
iterator
然而,性能下降得很快:
my @x = 1 .. 20, map { rand } 1 .. 1_000;
my @y = 1 .. 20, map { rand } 1 .. 1_000;
速率迭代器 array_comp
迭代器 10014/s -- -23%
array_comp 13071/s 31% --
我没有看内存利用率。