优化 – 为什么内联if语句的平均值至少比其他类型的if少三分之一
考虑以下Perl 6脚本框架:
my regex perlish { .*[ea]?[ui]? rl $} my Str @words = '/usr/share/dict/words'.IO.lines; for @words -> $word { ... } 从the perl6 website’s examples这个问题的代码的基本想法. 我的/usr/share / dict / words是/usr/share / dict / american-english的间接符号链接.它长99,171行,有一个字/行. 为了比较,Python 3 does 100 loops of the below in a total of 32 seconds: that’s just 0.32942s / loop.1 以下是我尝试用代替存根代码的内容,其基准时间如下所示: >“内联”if – 100循环,平均9.74219s /循环,总共16分14.219s say "$word probably rhymes with Perl" if $word ~~ /<perlish>/; say "$word is a palindrome" if $word eq $word.flip && $word.chars > 1; >短路(非三元) – 10个循环,平均6.1925s /循环,归一化到总计/ – 10.3分钟 $word eq $word.flip && $word.chars > 1 && say "$word is a palindrome"; $word ~~ /<perlish>/ && say "$word probably rhymes with Perl"; >给定/何时(开关/情况) – 100个循环,平均6.18568s /循环总计10分钟18.568s given $word { when /<perlish>/ { say "$word probably rhymes with Perl"; proceed; } when $word eq $word.flip && $word.chars > 1 { say "$word is a palindrome"; proceed; } } >“正常”如果阻止 – 100次循环,平均6.0588s /循环总计10分钟5.880s if $word eq $word.flip && $word.chars > 1 { say "$word is a palindrome"; } if $word ~~ /<perlish>/ { say "$word probably rhymes with Perl"; } 有点不出所料,正常的if块是最快的.但是,为什么内联if(网站使用的例子)这么慢? 1我不是说Perl 6很慢……但我认为Python很慢而且……哇. Perl 6很慢……忽略了多线程,并行性和并发性,所有这些都是由Perl 6构建的,并且Python留下了很多不足之处. 规格:Rakudo版本2015.12-219-gd67cb03在MoarVM版本2015.12-29-g8079ca5上实现Perl 6.c 我在“seq 0 100“中按时间运行测试; do perl6 –optimize = 3 words.pl6;完成. 解决方法
(此页面成为
p6doc Performance page.)
处理Perl 6速度问题 我不知道为什么if的语句修饰符形式较慢.但我可以分享一些可以帮助民众处理Perl 6速度问题的内容,所以我会先写一些最简单的内容. (对于用户和潜在用户来说,这意味着最简单的事情,对于编译器开发者而言,这并不是最简单的事情. 为什么代码的速度很重要? 我建议您分享这些更高级别问题的答案: >您的代码需要运行多快才能产生有价值的差异?全速加速可以再等一个月吗?另一年? 等待Rakudo加速 5年前,Rakudo的运行速度慢了1000倍或更多.多年来,它一直在大幅加速,尽管加速它显然不是第一优先级. (口头禅已经“让它发挥作用,让它正常工作,让它变得更快”.2016年是第一年“让它快速工作”的方面真正成为人们关注的焦点.) 因此,如果Rakudo Perl 6编译器对你想做的事情来说太慢了,那么imo是一个明智的选择,就是等待其他人为你做得更快.等待下一次正式发布(每年至少有几次)或等待一年或三年是有意义的,这取决于你正在寻找什么. 访问freenode IRC频道#perl6 编译器开发人员,最了解如何加速Perl 6代码的人,并没有回答SO问题.但他们通常对#perl6做出回应. 如果您没有从这里获得所需的所有细节或结果,那么您最好的选择是加入the freenode IRC channel #perl6并发布您的代码和时间. (请参阅接下来的两个标题,了解如何做到最好.) 个人资料代码段 MoakVM上的Rakudo有一个内置的分析器: $perl6 --profile -e 'say 1' 1 Writing profiler output to profile-1453879610.91951.html –profile选项目前仅用于微观分析 – 超出一小部分代码的输出将使您的浏览器瘫痪.但它可以用于比较简单片段的配置文件,使用if传统vs作为语句修饰符. (对于当前的分析器,使用示例的正则表达式几乎肯定过于复杂.) 在没有帮助的情况下,分析结果对您来说可能意义不大和/或可能指向混淆内部内容.如果是这样,请访问#perl6. 逐行编写更快的Perl 6代码 你的直接焦点似乎是为什么编写一行代码的方法比另一种方式慢.但这个“学术”问题的另一面是编写更快的代码行的实际问题. 但如果有人是Perl 6新手,他们怎么会知道怎么样?在这里询问是一种方式,但推荐的方法是访问#perl6并让民众知道你想要什么. #perl6具有通道上的evalbots,可帮助您和其他人一起调查您的问题.要公开输入代码片段,请输入m:您的代码就在这里.为此,私下写/ msg camelia m:你的代码就在这里. 对于简单的计时,现在使用成语的变化 – 现在INIT.您还可以使用#perl6 evalbot轻松生成和共享–profile结果.只需加入频道并输入prof-m:您的代码就在这里. 通过重构编写更快的Perl 6代码 >使用更好的算法,尤其是并行/并发算法. 有关执行此操作的详细信息,请访问#perl6. 使用(更快)外国代码 >对于诸如Gumbo或C libs(实验)的C库使用NativeCall包装器. NativeCall本身目前尚未得到很好的优化,但在2016年将会发生变化,对于许多应用来说,NativeCall开销无论如何都只是性能的一小部分. (对于像Inline::Python,Inline::Lua和Inline::Ruby这样的其他语言,有类似但不太成熟甚至是alpha的变体.) 审查基准 我所知道的最好的相关基准测试工具是perl6-bench,它将各种版本的Perl相互比较,包括Perl 5和Perl 6的各种版本. 可能已经有基准对比了常规if语句和语句修饰符形式if语句,但我对此表示怀疑. (如果没有,如果你写了一段非常简单的片段并将它们添加到perl6-bench中,你将会对Perl 6做出很好的贡献.) 帮助加速Rakudo Rakudo Perl 6编译器主要使用Perl 6编写.因此,如果您可以编写Perl 6,那么您可以破解编译器,包括优化影响代码速度的任何大量现有高级代码. 大多数编译器的其余部分都是用一种名为NQP的小语言编写的,它几乎只是Perl 6的一个子集.因此,如果你能编写Perl 6,你也可以很容易地学会使用和改进中级NQP代码. 最后,如果低级别的C黑客是你的乐趣,请查看MoarVM. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |