调试某些代码最终测试了$counter=$counter + 1;
与$counter+=1;
之类的语句中的差异
my $run=True;
my $counter=0;
my $sup=Supply.interval(1);
my $tap= $sup.tap({
$run=$_ < 10;
});
{
while $run {
#$counter+=1;
$counter=$counter + 1;
}
$tap.close;
say "Iterations per second: {$counter/(now - ENTER now)}"; #
}
与$counter=$counter+1
相比,$counter+=1;
的每秒迭代次数提高了约20%
在后台发生了什么,那是如此不同?
编辑:
有趣的是,在使用数组和超级运算符进行尝试时,使用+=
时,性能会大大提高 。
例如
@counter=@counter>>+<<@value;
与
@counter>>+=<<@value;
使用>>+=<<
和10_000个元素的数组,我得到的循环迭代次数约为2.8倍。
据我可以通过time
cmd判断,在两种情况下,并行执行最少(总用户+系统在实时的2%之内)。
任何关于这是为什么/为什么的见识都会很棒。谢谢!
答案 0 :(得分:16)
我将您的基准测试定为:
my $a = 0; for ^10_000_000 { $a += 1 }
vs:
my $a = 0; for ^10_000_000 { $a = $a + 1 }
如果使用perl6 --profile -e '...'
在事件探查器中运行这些示例,那么您会发现差异确实在20%范围内。唯一真正不同的是帧总数:+= 1
为49935579,= $a + 1
为39932197。
(在进行任何优化之前)根本的区别是+=
通过metaop路径。它没有定义为单独的运算符,因此需要动态创建运算符,将原始运算符(&infix:<+>
)作为参数并在其中建立一个Callable
。
FWIW,我很高兴看到如今的差异仅为20%:不久前,涉及metaops的任何事物的速度至少慢了两倍:-)