如何对Raku进行基准测试?

问题描述 投票:8回答:1

我经常按照GitHub Rakudo repository来查看Rakudo编译器中正在发生的变化。

我有时看到提交时,各个功能以一定的百分比加速,时间类似于下图。

enter image description here

评估该工作流程是什么?我很想学习这一点,因此one can知道您的函数是如何执行的,并据此进一步优化,可以为Rakudo开发做出贡献。

我阅读了帮助herehere。我用谷歌搜索,但找不到此信息。我还通过生成--profile输出的命令行here选项html了解了MoarVM分析器。寻找什么?

enter image description here

我不是正规的计算机科学专业人士。我了解Tony Hoare — “Premature optimization is the root of all evil”的名言,但是随着时间的流逝,一旦正确编写了代码,便希望对其进行优化。这个问题。

benchmarking raku rakudo
1个回答
8
投票

我使用--profile可以更好地了解瓶颈在哪里。产生的概要文件是一个很好的开始,但是当差异变得很小时,对于CPU使用率不是很好。但是,它非常擅长跟踪对象的分配,并且更少的对象分配至少可以意味着更少的内存流失(但是,如果对象very是短暂的,则并非总是如此)。而且用--profile跟踪内容也会对优化产生影响,因此Heisenberg的不确定性原理肯定适用于此。

一旦我有之前/之后的一段代码,我就可以将其作为脚本运行,也可以与time一起运行。我有一堆方便的别名可以帮助我:

alias r='time raku -e'
alias rp='raku --profile -e'

之所以将它们作为独立的过程(至少间隔几秒钟,是因为:

  1. 在该过程中运行多个基准往往会使CPU变热,然后将其节流,从而使以后的基准变得更糟。
  2. 如果两个基准测试在内核中共享一些代码,则较早的基准测试可能会受益于较早的基准测试已内联/ JIT插入的代码。

然后,我将每个之前和之后的代码运行3至5次,并执行一个Nil循环以找出开销。所以例如:

$ r 'my $a = "42"; Int($a) for ^100000'
real    0m0.244s

$ r 'my $a = "42"; $a.Int for ^100000'
real    0m0.178s

$ r 'my $a = "42"; Nil for ^100000'
real    0m0.154s

然后计算差异:

$ r 'say (244 - 154) / (178 - 154)'
3.75

因此,使用$a.Int的速度大约是Int($a)的3.75倍。当然哪个可以启动另一个--profile循环,从而找出Int($a)这么慢的原因。另外,当我看到无法解释的速度差异时,我会使用--profile来确定它是否确实在做我认为正在做的事情。特别是意料之外的常量折叠有时可能使您认为您找到了最佳优化,而实际上您实际上减少了代码以至于根本无所事事。

HTH

© www.soinside.com 2019 - 2024. All rights reserved.