Optimization 为什么内联if语句的平均速度比其他类型的if语句慢至少三分之一?

Optimization 为什么内联if语句的平均速度比其他类型的if语句慢至少三分之一?,optimization,raku,Optimization,Raku,考虑以下Perl 6脚本框架: my regex perlish{.*[ea]?[ui]?rl$} 我的Str@words='/usr/share/dict/words'.IO.line; 对于@words->$word{ ... } 此问题中代码的基本思想来自 My/usr/share/dict/words是指向/usr/share/dict/american english的间接符号链接。它有99171行,每行一个单词 为了比较起见,.1 以下是我尝试用它们来代替存根代码的东西,它们的基准

考虑以下Perl 6脚本框架:

my regex perlish{.*[ea]?[ui]?rl$}
我的Str@words='/usr/share/dict/words'.IO.line;
对于@words->$word{
...
}
此问题中代码的基本思想来自

My
/usr/share/dict/words
是指向
/usr/share/dict/american english
的间接符号链接。它有99171行,每行一个单词

为了比较起见,.1

以下是我尝试用它们来代替存根代码的东西,它们的基准时间如下所述:

  • “内联”
    if
    -100圈,平均9.74219s/圈,总计16分钟14.219s

    如果$word~~~//,则说“$word可能与Perl押韵”;
    如果$word eq$word.flip&&$word.chars>1,则说“$word是回文”;
    
  • 短路(非三元)10个回路,平均6.1925s/回路,标准化为总计+/-10.3min

    $word eq$word.flip&&$word.chars>1&&say“$word是回文”;
    $word~~~/&&说“$word可能与Perl押韵”;
    
  • 给定/when
    开关/case
    )-100圈,平均6.18568s/圈,总计10分钟18.568s

    给定$word{
    何时//
    {说“$word可能与Perl押韵”;继续;}
    当$word eq$word.flip&&$word.chars>1时
    {说“$word是回文”;继续;}
    }
    
  • “正常”
    if
    block-100圈,平均6.0588s/圈,总计10分钟5.880s

    如果$word eq$word.flip&&$word.chars>1{说“$word是回文”}
    如果$word~~~/{说“$word可能与Perl押韵”;}
    
毫不奇怪,正常的if块速度最快。但是,为什么内联
if
(网站使用的示例)速度要慢得多


1我不是说Perl 6很慢。。。但我认为Python很慢而且。。。哇!Perl6很慢。。。忽略多线程、并行性和并发性,所有这些都是Perl 6内置的,Python对此还有很多需要改进的地方


规范:
Rakudo版本2015.12-219-gd67cb03在MoarVM版本2015.12-29-g8079ca5上实现Perl 6.c
2.2GHz四核Intel Mobile i7,6GB内存

我在``seq 0 100``中为I运行了
time这样的测试;doperl6——优化=3个单词。pl6;完成

(此页成为当前页面。)

处理Perl6速度问题 我不知道为什么
if
的语句修饰符形式较慢。但我可以分享一些可以帮助人们处理Perl6速度问题的东西,所以我将首先介绍这些问题。(我指的是用户和潜在用户最容易做的事情,而不是编译器开发人员最容易做的事情。)

为什么代码的速度很重要?

我建议您分享这些更高层次问题的答案:

  • 您的代码需要运行多快才能产生有价值的变化?全速提速能再等一个月吗?再过一年

  • 您是为了好玩而探索Perl 6,评估它对您的潜在长期职业相关性,还是在$dayjob中使用它

等待Rakudo加速

5年前,Rakudo的速度慢了1000倍甚至更多。多年来,它每年都在显著加速,尽管加速显然不是开发人员的首要任务。(口头禅是“让它工作,让它工作正确,让它快速”。2016年是“让它工作快速”方面真正成为焦点的第一年。)

因此,在我看来,如果Rakudo Perl 6编译器对于您想要做的事情来说实在太慢,那么一个明智的选择就是等待其他人让它更快。等待下一次官方发布(每年至少有几次)或者等待一年或三年是有意义的,这取决于你在寻找什么

每6天访问freenode IRC频道

编译器开发人员是最了解如何加速Perl 6代码的人,他们没有回答这么多问题。但他们通常都会做出反应

如果你没有从这里得到你想要的所有细节或结果,那么你最好的选择就是加入并发布你的代码和时间。(请参阅下面两个标题了解如何最好地做到这一点。)

配置文件代码片段

MoarVM上的Rakudo有一个内置的探查器:

$ perl6 --profile -e 'say 1'
1
Writing profiler output to profile-1453879610.91951.html
--profile
选项目前仅用于微观分析——任何超出一点点代码的输出都会使浏览器崩溃。但它可以用来比较使用
if
作为语句修饰符的简单片段的概要文件。(使用示例的正则表达式对于当前的分析器来说肯定太复杂了。)

在没有帮助的情况下,分析结果可能对您没有什么意义,并且/或者可能指向令人困惑的内部内容。如果是,请访问#per6

逐行编写更快的Perl 6代码

您当前关注的问题似乎是为什么一种编写代码行的方法比另一种方法慢。但这个“学术”问题的另一面是编写更快代码行的实际问题

但是如果有人是Perl6新手,他们怎么会知道怎么做呢?在这里提问是一种方法,但推荐的方法是访问,让人们知道你想要什么

#perl6频道上有帮助您和其他人一起调查您的问题的evalbot。要公开尝试代码片段,请输入
m:您的代码在此处
。要做到这一点,请私下编写
/msg camelia m:您的代码放在这里

对于简单的计时,请使用习惯用法
now-initnow
的变体。您还可以使用#perl6 evalbot轻松生成和共享
--profile
结果。只需加入频道并输入
prof-