Perl   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了并发性 – Perl 6中是否存在快速并行的“for”循环?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
鉴于一些代码对1到500000的每个数字进行了一些数学/转换,我们有以下选项:

>简单的循环:for ^ 500000 – > $i {my $result =($i ** 2).Str; }.在我不科学的基准测试中,这需要2.8秒.@H_616_3@>最规范的并行版本在Promise中完成每一项工作,然后等待结果.等待做^ 500000 – > $i {start {my $result =($i ** 2).Str;需要19秒.这很慢!创建一个新的promise必须有太多的开销才能进行这样一个简单的计算.@H_616_3@>使用并行映射操作相当快.在2.0秒时,操作似乎几乎不足以利用并行化:(^ 500000).race.map: – > $i {my $result =($i ** 2).Str; }

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

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

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

解决方法

如果你想使用超级或竞赛操作,你必须将其拼写为@ blah.hyper(:batch(10_000))或@ blah.race(:batch(10_000)).或者没有参数:@blah的超级,为@blah竞争.

之所以这样做是因为你可能拥有像some-operation(){some-non-threadsafe-codE}这样的代码,其中某些操作是库或其他东西的一部分.现在你不能再告诉for循环是否可以包含线程不安全的代码,即使你知道库在那个时间点没有返回HyperSeq,如果库作者想出了这个伟大的内容怎么办?通过加强它来使某些操作更快的想法?

这就是为什么在代码所在的位置需要一个“并行运行此for循环”的能指的原因,而不仅仅是创建序列的地方.

大佬总结

以上是大佬教程为你收集整理的并发性 – Perl 6中是否存在快速并行的“for”循环?全部内容,希望文章能够帮你解决并发性 – Perl 6中是否存在快速并行的“for”循环?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。