并发性 – Perl 6中是否存在快速并行的“for”循环?
鉴于一些代码对1到500000的每个数字进行了一些数学/转换,我们有以下选项:
>简单的循环:for ^ 500000 – > $i {my $result =($i ** 2).Str; }.在我不科学的基准测试中,这需要2.8秒. 第三种选择似乎最好.不幸的是,它看起来像一个黑客.我们不应该在接收器上下文中为迭代编写映射代码,因为在源中读取“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循环”的能指的原因,而不仅仅是创建序列的地方. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |