如何对乐库进行基准测试?

时间:2020-05-14 07:18:19

标签: benchmarking raku rakudo

我定期遵循GitHub Rakudo repository,以查看Rakudo编译器中正在发生的变化。

有时我会看到一些提交,在这些提交中,各个功能以一定的百分比加速,时间如下图所示。

enter image description here

要对此进行评估的工作流程是什么?我很想了解这一点,因此一个人可以知道您的功能如何执行并相应地进一步优化,并可以为Rakudo开发做出贡献。

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

enter image description here

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

1 个答案:

答案 0 :(得分:10)

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

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

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

之所以我将其作为单独的过程(至少间隔几秒钟)是因为

  1. 在该过程中运行多个基准测试往往会导致CPU过热,从而使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