gpt4 book ai didi

raku - 馈送运算符(operator)管道的行为

转载 作者:行者123 更新时间:2023-12-04 18:18:57 25 4
gpt4 key购买 nike

我正在使用以下代码试验提要运算符:

my $limit=10000000;
my $list=(0,1...4);
sub task($_,$name) {
say "Start $name on $*THREAD";
loop ( my $i=0; $i < $limit; $i++ ){};
say "End $name";
Nil;
}

sub stage( &code, *@elements --> Seq) {
map(&code, @elements);
}

sub feeds() {
my @results;
$list
==> map ({ task($_, "stage 1"); say( now - ENTER now );$_+1})
==> map ({ task($_, "stage 2"); say( now - ENTER now );$_+1})
==> stage ({ task($_, "stage 3"); say( now - ENTER now );$_+1})
==> @results;

say @results;
}

feeds();
  • 任务子只是一个循环来燃烧cpu周期并显示使用的线程
  • stage sub 是 map sub
  • 的包装器
  • 馈送管道的每一步都映射到调用 CPU 密集型任务并对其计时。映射的结果是输入+1

  • 运行时的输出是:
    Start stage 1 on Thread<1>(Initial thread)
    End stage 1
    0.7286811
    Start stage 2 on Thread<1>(Initial thread)
    End stage 2
    0.59053989
    Start stage 1 on Thread<1>(Initial thread)
    End stage 1
    0.5955893
    Start stage 2 on Thread<1>(Initial thread)
    End stage 2
    0.59050998
    Start stage 1 on Thread<1>(Initial thread)
    End stage 1
    0.59472201
    Start stage 2 on Thread<1>(Initial thread)
    End stage 2
    0.5968531
    Start stage 1 on Thread<1>(Initial thread)
    End stage 1
    0.5917188
    Start stage 2 on Thread<1>(Initial thread)
    End stage 2
    0.587358
    Start stage 1 on Thread<1>(Initial thread)
    End stage 1
    0.58689858
    Start stage 2 on Thread<1>(Initial thread)
    End stage 2
    0.59177099
    Start stage 3 on Thread<1>(Initial thread)
    End stage 3
    3.8549498
    Start stage 3 on Thread<1>(Initial thread)
    End stage 3
    3.8560015
    Start stage 3 on Thread<1>(Initial thread)
    End stage 3
    3.77634317
    Start stage 3 on Thread<1>(Initial thread)
    End stage 3
    3.6754558
    Start stage 3 on Thread<1>(Initial thread)
    End stage 3
    3.672909
    [3 4 5 6 7]

    结果在 @result是正确的(来自 $list 的输入增加了 3 三倍)

    前两个阶段的输出拉动/交替,但第三阶段直到第 2 阶段的所有输入完成后才执行

    我的 map 子包装器是否存在问题导致此行为?

    此外,在包装器中进行评估所需的时间明显长于直接调用 map。

    任何帮助表示赞赏。

    最佳答案

    slurpy 参数正在等待消耗传递给它的整个序列。考虑以下区别:

    perl6 -e 'sub foo($) { }; my $items := gather for 1..Inf { say $_ }; foo($items);'
    perl6 -e 'sub foo(*@) { }; my $items := gather for 1..Inf { say $_ }; foo($items);'

    第一个例子会结束,第二个永远不会结束。因此,您希望将舞台功能更改为:
    sub stage( &code, $elements --> Seq) {
    map(&code, $elements);
    }

    关于raku - 馈送运算符(operator)管道的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55178117/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com