scala – 使用并行集合时批量执行哪些操作?这里奇怪的行为
发布时间:2020-12-16 09:56:30 所属栏目:安全 来源:网络整理
导读:在 Scala REPL中输入以下小顺序程序及其并行化版本: /* Activate time measurement in "App" class. Prints [total X ms] on exit. */util.Properties.setProp("scala.time","true")/* Define sequential program version. */object X extends App { for (x
在
Scala REPL中输入以下小顺序程序及其并行化版本:
/* Activate time measurement in "App" class. Prints [total <X> ms] on exit. */ util.Properties.setProp("scala.time","true") /* Define sequential program version. */ object X extends App { for (x <- (1 to 10)) {Thread.sleep(1000);println(x)}} /* Define parallel program version. Note '.par' selector on Range here. */ object Y extends App { for (y <- (1 to 10).par) {Thread.sleep(1000);println(y)}} 使用X.main(Array.empty)执行X会给出: 1 2 3 4 5 6 7 8 9 10 [total 10002ms] 而Y与Y.main(Array.empty)给出: 1 6 2 7 3 8 4 9 10 5 [total 5002ms] 到现在为止还挺好.但是该程序的以下两种变体如何: object X extends App {(1 to 10).foreach{Thread.sleep(1000);println(_)}} object Y extends App {(1 to 10).par.foreach{Thread.sleep(1000);println(_)}} 给我的运行时间分别为[总共1002ms]和[总共1002ms].怎么会这样? 解决方法
这与并行集合无关.问题隐藏在函数文字中.如果让编译器显示AST(使用选项-Xprint:typer),你可以看到它:
for (x <- (1 to 10)) {Thread.sleep(1000);println(x)} 产生 scala.this.Predef.intWrapper(1).to(10).foreach[Unit](((x: Int) => { java.this.lang.Thread.sleep(1000L); scala.this.Predef.println(x) })) 而 (1 to 10).foreach{Thread.sleep(1000);println(_)} 产生 scala.this.Predef.intWrapper(1).to(10).foreach[Unit]({ java.this.lang.Thread.sleep(1000L); ((x$1: Int) => scala.this.Predef.println(x$1)) }) 有一点不同.如果您想要预期的结果,则必须将foreach-expression更改为 (1 to 10).foreach{x => Thread.sleep(1000);println(x)} 但有什么区别?在您的代码中,您向foreach声明了一个块,在执行该块后,它将返回要执行的函数.然后将此返回的函数传递给foreach而不是包含它的块. 这个错误经常发生.它与下划线文字有关.也许this question会帮助你. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读