gpt4 book ai didi

raku - 为什么 += 与 + 的性能差异?

转载 作者:行者123 更新时间:2023-12-03 22:18:44 25 4
gpt4 key购买 nike

调试一些代码最终测试了语句中的差异,例如$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,我每秒的迭代次数增加了大约 20%。与 $counter+=1; 相比

在如此不同的背景中发生了什么?

编辑:

有趣的是,当使用数组和 super 运算符尝试此操作时,使用 += 时性能大大提高。 .

例如 @counter=@counter>>+<<@value;对比 @counter>>+=<<@value;我使用 >>+=<< 得到了大约 2.8 倍的循环迭代次数具有 10_000 个元素的数组。

据我所知,通过 time cmd 在任何一种情况下都有最少的并行执行(总用户 + 系统在实时的 2% 以内)。

任何关于如何/为什么会这样的见解都会很棒。谢谢!

最佳答案

我已经将您的基准打高尔夫球:

my $a = 0; for ^10_000_000 { $a += 1 }

对比:
my $a = 0; for ^10_000_000 { $a = $a + 1 }

如果您在分析器中使用 perl6 --profile -e '...' 运行这些示例,然后您会看到差异确实在 20% 的范围内。唯一真正不同的是总帧数:49935579 表示 += 1和 39932197 为 = $a + 1 .

潜在的区别(在任何优化之前)是 +=穿过 metaop 路径。它没有定义为单独的运算符,因此需要动态创建运算符,以原始运算符 ( &infix:<+> ) 作为参数并构建 Callable出于那个。

FWIW,我很高兴看到现在只有 20% 的差异:不久前,涉及 metaops 的任何事情都至少慢了 2 倍:-)

关于raku - 为什么 += 与 + 的性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55271148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com