相关疑难解决方法(0)

Perl 6中的"种族"何时值得?

race将iterable上的操作自动划分为线程.例如,

(Bool.roll xx 2000).race.sum
Run Code Online (Sandbox Code Playgroud)

会自动将2000长阵列的总和分成4个线程.但是,基准测试显示,这比race没有使用时要慢得多.即使您使阵列更大,也会发生这种情况.即使非自动编程版本随每个版本变得越来越快,也会发生这种情况.(自动线程也变得更快,但仍然是不使用它的两倍.)

所以问题是:值得使用的原子操作的最小大小是多少?添加到顺序操作的开销是固定的还是可以某种方式降低?

更新:实际上,性能hyper(类似于种族,但有保证的有序结果)似乎随着时间的推移而变得越来越差,至少对于小尺寸而言,它们仍然是默认批量大小的整数倍(64).同样的情况与race

concurrency perl6 raku

10
推荐指数
1
解决办法
215
查看次数

Raku .hyper() 和 .race() 示例不起作用

以下示例代码应该可以加速 Raku 程序的执行:

for (1..4).race()  {
    say "Doing $_";
    sleep 1;
 }
 say now - INIT now;
Run Code Online (Sandbox Code Playgroud)

我记得,它在一段时间前有效,但现在我总是以 4 秒的运行时间结束。同样使用 .race() 或添加参数不会改变任何东西。我必须做什么才能同时运行 2 个进程?

raku

8
推荐指数
1
解决办法
208
查看次数

在Perl 6中是否有一个快速并行的"for"循环?

鉴于一些代码对1到500000的每个数字进行了一些数学/转换,我们有以下选项:

  1. 简单的循环:for ^500000 -> $i { my $result = ($i ** 2).Str; }.在我不科学的基准测试中,这需要2.8秒.

  2. 最规范的并行版本在a中完成每一项工作Promise,然后等待结果.await do for ^500000 -> $i { start { my $result = ($i ** 2).Str; } }需要19秒.这很慢!创建一个新的promise必须有太多的开销才能进行这样一个简单的计算.

  3. 使用并行map操作相当快.在2.0秒时,操作似乎几乎不足以利用并行化:(^500000).race.map: -> $i { my $result = ($i ** 2).Str; }

第三种选择似乎最好.不幸的是,它看起来像一个黑客.我们不应该map在sink上下文中编写迭代代码,因为在源代码中读取"map"的其他人可能会认为目的是构建一个列表,这根本不是我们的意图.使用map这种方式的沟通很差.

有没有任何规范的快速方法来使用Perl 6的内置并发?如果一个超级运算符可以接受一个块而不仅仅是函数,那么它将是完美的:

(^500000)».(-> $i { my $result = ($i ** 2).Str; }) # No such method 'CALL-ME' for invocant of type 'Int'
Run Code Online (Sandbox Code Playgroud)

concurrency perl6

5
推荐指数
1
解决办法
374
查看次数

Raku 提供了哪些并发机制以及如何对其进行评估?

我是一名学生,目前正在撰写有关 Raku 的论文,为此我决定评估 Raku (Perl 6) 在处理高并发时是否是一种好语言。

除了官网,我还没有找到任何关于 Raku 并发的论文。另外,我不知道如何评估 Raku 的并发性(例如,我应该使用什么程序,应该将哪种语言与 Raku 进行比较等等)。

Raku 提供了哪些并发机制?这些记录在哪里?如何评估它们的功能和性能?

concurrency raku

3
推荐指数
3
解决办法
338
查看次数

标签 统计

concurrency ×3

raku ×3

perl6 ×2