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
2.2GHz QuadCore Intel Mobile i7,配备6GB RAM.
我在“seq 0 100“中按时间运行测试; do perl6 –optimize = 3 words.pl6;完成.
解决方法
处理Perl 6速度问题
我不知道为什么if的语句修饰符形式较慢.但我可以分享一些可以帮助民众处理Perl 6速度问题的内容,所以我会先写一些最简单的内容. (对于用户和潜在用户来说,这意味着最简单的事情,对于编译器开发者而言,这并不是最简单的事情.
为什么代码的速度很重要?
我建议您分享这些更高级别问题的答案:
>您的代码需要运行多快才能产生有价值的差异?全速加速可以再等一个月吗?另一年?
>您是否正在探索Perl 6的乐趣,评估其潜在的长期专业相关性,和/或在您的$dayjob中使用它?
等待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代码
>使用更好的算法,尤其是并行/并发算法.
>使用本机数组(例如,数组[int8]为8位整数数组)进行紧凑,更快速的数字运算.
有关执行此操作的详细信息,请访问#perl6.
使用(更快)外国代码
>对于诸如Gumbo或C libs(实验)的C库使用NativeCall包装器. NativeCall本身目前尚未得到很好的优化,但在2016年将会发生变化,对于许多应用来说,NativeCall开销无论如何都只是性能的一小部分.
> Inline :: Perl5构建在NativeCall上,以支持使用Perl 5 in Perl 6 (and vice-versa),包括任意Perl 5代码和高性能Perl 5 XS模块.这个互操作允许在Perl 5和Perl 6之间传递整数,字符串,数组,散列,代码引用,文件句柄和对象;从Perl 6调用Perl 5对象上的方法,并从Perl 5调用Perl 6对象上的方法;并在Perl 6中继承Perl 5类.
(对于像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.