scala并行采集处理的性能
发布时间:2020-12-16 18:22:44 所属栏目:安全 来源:网络整理
导读:我有一些场景,我需要一次处理数千条记录.有时,它可能是数百,可能高达30000条记录.我在考虑使用 scala的并行集合.所以只是为了理解差异,我写了一个简单的pgm,如下所示: object Test extends App{ val list = (1 to 100000).toList Util.seqMap(list) Util.pa
我有一些场景,我需要一次处理数千条记录.有时,它可能是数百,可能高达30000条记录.我在考虑使用
scala的并行集合.所以只是为了理解差异,我写了一个简单的pgm,如下所示:
object Test extends App{ val list = (1 to 100000).toList Util.seqMap(list) Util.parMap(list) } object Util{ def seqMap(list:List[Int]) = { val start = System.currentTimeMillis list.map(x => x + 1).toList.sum val end = System.currentTimeMillis println("time taken =" + (end - start)) end - start } def parMap(list:List[Int]) = { val start = System.currentTimeMillis list.par.map(x => x + 1).toList.sum val end = System.currentTimeMillis println("time taken=" + (end - start)) end - start } } 我预计并行运行会更快.但是,我得到的输出是 time taken =32 time taken=127 机器配置: Intel i7 processor with 8 cores 16GB RAM 64bit Windows 8 我究竟做错了什么?这不是并行映射的正确方案吗? 解决方法
问题是你正在执行的操作是如此之快(只是增加两个整数),这使得并行化的开销不仅仅是好处.如果操作较慢,并行化才真正有意义.
可以这样想:如果你有8个朋友,你给每个人一个整数写在一张纸上并告诉他们加一个,把结果写下来,然后把它还给你,你会在给他们之前记录下来下一个整数,你花了很多时间来回传递消息,你可以完成所有更快的添加. 另外:永远不要在List上执行.par,因为并行化过程必须将整个列表复制到并行集合中,然后将整个事件复制回来.如果你使用Vector,那么它不需要做额外的工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |