如何对 Raku 进行基准测试?

Sum*_*nal 11 benchmarking rakudo raku

我定期关注GitHub Rakudo 存储库,以查看 Rakudo 编译器中发生的变化。

我有时会看到提交,其中单个功能被加速了一定的百分比,时间如下图所示。

在此处输入图片说明

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

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

在此处输入图片说明

我不是一个正式的计算机科学人。我理解Tony Hoare 的名言——“过早优化是万恶之源”,但随着时间的推移,一旦代码编写正确,人们就会希望对其进行优化。所以问题。

Eli*_*sen 12

我用来--profile更好地了解瓶颈在哪里。生成的配置文件是一个好的开始,但当差异变得非常小时时,对 CPU 使用率不是很好。然而,它非常擅长跟踪对象的分配,更少的对象分配至少意味着更少的内存流失(但并非总是如此,如果对象的生命周期短)。并且跟踪事物--profile对优化也有影响,因此海森堡的不确定性原理在这里绝对适用。

一旦我有一段之前/之后的代码,我就会将它作为脚本或作为带有time. 我有一堆方便的别名可以帮助我解决这个问题:

alias r='time raku -e'
alias rp='raku --profile -e'
Run Code Online (Sandbox Code Playgroud)

我将其作为单独的进程进行至少几秒钟之间的原因是:

  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
Run Code Online (Sandbox Code Playgroud)

然后计算差异:

$ r 'say (244 - 154) / (178 - 154)'
3.75
Run Code Online (Sandbox Code Playgroud)

因此,它是大约3.75倍的速度来使用$a.IntInt($a)。这当然可以开始另一个--profile循环,找出为什么Int($a)这么慢。此外,当我看到无法解释的速度差异时,我会使用 a--profile来确定它是否真的在做我认为它正在做的事情。特别意外的常量折叠有时会让您认为您找到了最佳优化,而实际上您将代码减少到基本上什么都不做。

HTH