我经常按照GitHub Rakudo repository来查看Rakudo编译器中正在发生的变化。
我有时看到提交时,各个功能以一定的百分比加速,时间类似于下图。
评估该工作流程是什么?我很想学习这一点,因此one can知道您的函数是如何执行的,并据此进一步优化,可以为Rakudo开发做出贡献。
我阅读了帮助here,here。我用谷歌搜索,但找不到此信息。我还通过生成--profile
输出的命令行here选项html
了解了MoarVM分析器。寻找什么?
我不是正规的计算机科学专业人士。我了解Tony Hoare — “Premature optimization is the root of all evil”的名言,但是随着时间的流逝,一旦正确编写了代码,便希望对其进行优化。这个问题。
我使用--profile
可以更好地了解瓶颈在哪里。产生的概要文件是一个很好的开始,但是当差异变得很小时,对于CPU使用率不是很好。但是,它非常擅长跟踪对象的分配,并且更少的对象分配至少可以意味着更少的内存流失(但是,如果对象very是短暂的,则并非总是如此)。而且用--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