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)
我将其作为单独的进程进行至少几秒钟之间的原因是:
然后我运行每个前后代码 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.Int比Int($a)。这当然可以开始另一个--profile循环,找出为什么Int($a)这么慢。此外,当我看到无法解释的速度差异时,我会使用 a--profile来确定它是否真的在做我认为它正在做的事情。特别意外的常量折叠有时会让您认为您找到了最佳优化,而实际上您将代码减少到基本上什么都不做。
HTH
| 归档时间: |
|
| 查看次数: |
215 次 |
| 最近记录: |