首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用质数进行Perl6与Perl5基准测试

使用质数进行Perl6与Perl5基准测试
EN

Stack Overflow用户
提问于 2018-04-02 16:25:11
回答 2查看 934关注 0票数 8

这是从这里的HN thread移来的讨论,关于使用实现查找质数的Sieve of Sundaram的算法对Perl6、Perl5和其他语言进行基准测试。

以下是原始线程中的原始代码:

perl5 0m0.156s

perl6 0m6.615s

问题是,与Perl5实现相比,Perl6版本查找质数花费的时间太长。部分原因是使用了float作为输入,但它仍然太慢了。

目标不一定是优化算法,而是要找出为什么Perl6与其他语言相比如此缓慢。

EN

回答 2

Stack Overflow用户

发布于 2018-04-02 18:50:24

事实证明,尽管素数是整数,但在Perl6版本中,每次计算都是使用浮点进行的。这是由对子例程的调用引起的。如果你愿意这样做:

代码语言:javascript
复制
sieve_sundaram(1000)

而不是:

代码语言:javascript
复制
sieve_sundaram(1e3)

然后它突然变得快了4倍。在Perl5中,您永远不知道要处理的值是什么。在Perl6中,如果你告诉它使用浮点数,它会影响所有的计算,使其成为浮点数。1e3是一个浮点值。在Perl6中,1000是一个整数。

而且,您似乎有一种次优算法:第二个foreach不需要从1..$n开始,但可以从$i..$n开始。对我来说,这使得Perl5版本的代码运行时间缩短到89msec。

由于您的程序在Perl5版本中没有使用BigInt,因此它基本上使用的是本机整数。在Perl6中,所有整数计算都是原生的,除非您将它们标记为BigInts。如果我调整你的Perl6版本,这个版本的运行时间从4671毫秒下降到414毫秒:

代码语言:javascript
复制
sub sieve_sundaram(int $n) {
    my %a;
    my int @s = 2;
    my int $m = $n div 2 - 1;
    for 1..$n -> int $i {
        for $i..$n -> int $j {
            my int $p = $i + $j + 2 * $i * $j;
            if $p < $m {
                %a{$p} = True;
            }
        }
    }
    for 1..$m -> int $k {
        if ! %a{$k} {
            my int $q = 2 * $k + 1;
            @s.push($q);
        }
    }

    return @s;
}

sieve_sundaram(1000);

因此,速度比以前快了大约11倍。比Perl5版本慢不到5倍。

在Perl6中获取素数的最常用版本是:

代码语言:javascript
复制
(1..1000).grep( *.is-prime )

对我来说,它是在原始Perl 5算法的噪声中执行的。对于多CPU机器上较大的值,我会这样写:

代码语言:javascript
复制
(1..2500).hyper.grep( *.is-prime )

在2500年左右,它变得更快的hyper它,因此工作自动分配到多个中央处理器。

票数 14
EN

Stack Overflow用户

发布于 2018-04-02 20:51:33

我想我不能对Liz说的话再多加什么了。除以下内容外:

“但是为了对多种语言进行基准测试,我需要在任何地方运行相同的东西。”

...where "same“在英语中被定义为看起来相似的语法,对于完全不同的编程语言之间的等价性来说,这是一个非常糟糕的标准。Perl 6的语法与Perl 5非常相似,甚至完全相同,但其底层的语义却截然不同。整个语言已经针对正确性进行了调整,默认语法很容易达到,而不是最优行为。另一个很好的例子是Perl 6字符串,它们非常慢,它们总是完全标准化的unicode,而不是普通字节的字符串。对它们的所有操作都考虑了字素的unicode概念,而不是字节和字节偏移量。这太棒了!但与C/Perl5字符串更等价的类型可能是Buf,不幸的是,它没有像操作符/方法那样的字符串,而只是一个字节块。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49607801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档