【发布时间】:2019-04-16 13:38:00
【问题描述】:
我一直在阅读关于 Captures 的文章,这一段让我很感兴趣:
在签名中,可以通过添加无符号前缀来创建捕获 带有竖线 | 的参数。这包含了其余的 参数列表到该参数中。
这听起来很像**@(非扁平化)slurpy,所以编造了这个测试代码:
my $limit=1_000_000;
my @a=1 xx 10000;
my @b=-1 xx 10000;
sub test1(|c){
1;
};
sub test2(**@c){
1;
};
{
for ^$limit {
test1(@b,@a);
}
say now - ENTER now;
}
{
for ^$limit {
test2(@b,@a);
}
say now - ENTER now;
}
样本运行给出每个测试块的持续时间:
0.82560328
2.6650674
Capture 显然具有性能优势。以这种方式使用 Capture 作为 slurpy 有不利的一面吗?我是否过度简化了比较?
【问题讨论】:
-
当使用子例程时,捕获
|c将采用非扁平化 slurpy**@c不会采用的“意外命名参数”。 -
我想真正的问题是你打算用 c 做什么?
-
@CurtTilmes 没有直接的计划,只是为了了解 Captures 并寻找简单的性能提升,以便多次重复调用 subs
-
我不知道有什么特别的缺点 - 如果它适用于您的情况,请使用它!