我定期遵循GitHub Rakudo repository,以查看Rakudo编译器中正在发生的变化。
有时我会看到一些提交,在这些提交中,各个功能以一定的百分比加速,时间如下图所示。
要对此进行评估的工作流程是什么?我很想了解这一点,因此一个人可以知道您的功能如何执行并相应地进一步优化,并可以为Rakudo开发做出贡献。
我已阅读here,here以获得帮助。我用谷歌搜索,但找不到此信息。我还通过命令行--profile
选项here了解了MoarVM事件探查器,该选项生成了html
的输出。寻找什么?
我不是正规的计算机科学专业人士。我了解Tony Hoare — “Premature optimization is the root of all evil”的名言,但是随着时间的流逝,一旦正确编写了代码,人们便希望对其进行优化。所以是问题。
答案 0 :(得分:10)
我使用--profile
来更好地了解瓶颈在哪里。产生的概要文件是一个很好的开始,但是当差异变得很小时,对于CPU使用率不是很好。但是,它非常擅长跟踪对象的分配,并且更少的对象分配至少可以意味着更少的内存流失(如果对象非常是短暂的,则并非总是如此)。并且使用--profile
跟踪内容也会对优化产生影响,因此Heisenberg的不确定性原理肯定适用于此。
一旦我拥有一段之前/之后的代码,我就可以将其作为脚本或与time
一起使用。我有一堆方便的别名可以帮助我:
alias r='time raku -e'
alias rp='raku --profile -e'
之所以我将其作为单独的过程(至少间隔几秒钟)是因为
然后,我将每个之前和之后的代码运行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