加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

优化 – 为什么内联if语句的平均值至少比其他类型的if少三分之一

发布时间:2020-12-15 21:59:13 所属栏目:大数据 来源:网络整理
导读:考虑以下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 / d
考虑以下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
2.2GHz QuadCore Intel Mobile i7,配备6GB RAM.

我在“seq 0 100“中按时间运行测试; do perl6 –optimize = 3 words.pl6;完成.

解决方法

(此页面成为 p6doc Performance page.)

处理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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读