Scala:par并行集合计算(fold、aggregate)结果与cpu内核线程的关系
下午在运行以下代码时,结果有两种可能:25或30
val list = (1 to 4).toList
var res = list.par.aggregate(5)(_+_,_+_)
关于aggregate函数,这是一个具有柯里化特征的函数;可以传入自定义两个方法,将计算过程打印一遍
val list = (1 to 4).toList// 第一个()内的5传递给第二个()内seqno函数作为每次循环(列表中元素为n,遍历完整个列表循环则结束)的第一个参数m// combine函数将之前的返回值作为传入参数进行运算var res = list.par.aggregate(5)(seqno,combine) //等同于_+_ def seqno(m:Int,n:Int): Int ={val s = "seq_exp=%d+%d"println(s.format(m,n))return m+n}//等同于_+_def combine(m:Int,n:Int): Int ={val s = "com_exp=%d+%d"println(s.format(m,n))return m+n}
seq_exp=5+2
seq_exp=5+3
seq_exp=5+1
seq_exp=5+4com_exp=6+7
com_exp=8+9com_exp=13+17
最终结果应该是30(5*4+1+2+3+4)才是理想的
这就需要考虑到机器cpu内核线程的数量了,par函数将以上集合转换为4个元素并行集合,也就是理想状态下需要有4个线程参与运算,所以才是4*5,5传递给了给个并行的线程,相当于每个线程运行aggregate()函数,只要在运行全程中有4个线程以上是有运行条件时才会得到理想结果30
即使有足够多的内核进行运行,还要考虑效率问题与cpu占有率,所以为了达到并行的效果(>1线程),至少需要2个线程在不断地运行
我的电脑是4核8线程,所以最理想的状态下有8个线程同时运行(允许8个元素的并行集合),但实际上很难达到
比如增加运行的次数
val list = (1 to 5).toListfor (i <- 1 to 10000) {var res = list.par.aggregate(5)(_+_,_+_)println(res)}
理想结果应该为 5*5+5!=40,只有在程序刚跑起来的一会输出了大量的40,而基本后半段结果都为30(5!+3*5)
不过像aggregate和fold应该很少有给第一个函数赋不为0的值的需求,一般都为list.par.aggregate(0)(xx,xx)来对并行集合运算,这样就不需要考虑内核线程影响结果值了,反正是至少有2个线程在运行
fold函数只能做一种运算
val b=Array(1,2,3,4,5,6)
println(b.fold(10)(_+_)) //31
println((b.par.fold(10)(_+_))) //与内核有关,我最高81,即6个线程在运行,6*10+6!
println((b.par.fold(0)(_+_))) //21,并行运行结果,效率比b.fold(0)(_+_)高
Scala:par并行集合计算(fold、aggregate)结果与cpu内核线程的关系相关推荐
- scala学习之scala中一些集合的常用函数
scala学习 集合常用函数 集合的基本属性与常用操作 长度.大小.循环遍历.迭代器.生成字符串.是否有包含等 object TestSetFunction {def main(args: Array ...
- scala 编程(其五)集合,交差交差集
scala 聚合 1,par 指的是(并行)多线程聚合,有可能造成误差,但是外加上 foldLeft那么就会一个一个 2,flatten 属性将 list之中的小型list进行聚合到一个大的list之 ...
- Scala编程基础——集合高阶函数
Scala编程基础--集合&高阶函数 集合 Scala中集合分为可变集合和不可变集合 可变集合:可以修改.添加.移除一个集合的元素. 不可变集合:安全的并发访问. 不可变集合,相比之下,永远不 ...
- Scala 中的集合(三):实现一个新的 Collection 类
本文由 Yison 发表在 ScalaCool 团队博客. Scala 中的 collection 库是符合 DRY 设计原则的典范,它包含了大量通用的集合操作 API,由此我们可以基于标准库,轻松构 ...
- 任务并行库(Task Parellel Library)parallel.for parallel.foreach、List、ConcurrentBag 并行集合、线程安全结合
普通的for .foreach 都是顺序依次执行的. C#当中我们一般使用for和foreach执行循环,有时候我们呢的循环结构每一次的迭代需要依赖以前一次的计算或者行为.但是有时候则不需要.如果迭代 ...
- Scala与Java集合互转摘要
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- scala学习笔记-集合操作(15)
Scala的集合体系结构 1 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的集合体系非常相似 ...
- 【Scala】Scala中常见集合的使用---代码详解
1.List集合的使用及创建 object ListDemo1 {def main(args: Array[String]): Unit = {//创建一个Listval list: List[Int ...
- 量子计算机 并行,核磁共振量子计算机与并行量子计算.pdf
核磁共振量子计算机与并行量子计算 12 物理与工程 Vol . 13 No . 3 2003 专题讲座 核磁共振量子计算机与并行量子计算 龙桂鲁1 ,2 ,3 肖 丽1 ,2 ( 1 清华大学物理系 ...
- Scala中的集合排序
Scala中的集合排序 在scala中,排序不再像java中的那么复杂,除了Map之外,其他的集合类型都可以使用自己的排序方法,排序方法主要有三个: 1.sorted 2.sortWith 3.sor ...
最新文章
- ELFhash - 优秀的字符串哈希算法
- win32 debug api 原理
- 01 决策树 - 数学理论概述 - 熵
- 闪屏页新手引导页面主页判断跳转的逻辑
- 解决路由环路问题的探讨
- python产生随机数_python技能:random库的使用
- mysql 查询正在运行的事务并且杀掉该事务
- GPS定位技术相关的毕业论文有哪些呢?
- 竖着的seekbar_自定义竖着的SeekBar | 学步园
- SEO实战密码:60天网站流量提高20倍(第2版)
- iOS可持续化集成: Jenkins + bundler + cocoapods + shenzhen + fastlane + pgyer
- python 3d重建_python三维重建
- 迪杰斯特拉算法c语言6,迪杰斯特拉算法C语言实现
- vue3使用keep-alive页面切换时报错:TypeError: parentComponent.ctx.deactivate is not a function
- 【修改电脑版微信提示音】
- 十个突出问题整改追踪:智慧城市建设滞后
- MMS流媒体下载原理
- java 软件开发面试宝典
- 制作docker容器镜像
- form表单中id与name的区别
热门文章
- [linux shell] hostid使用方法以及原理
- Java美颜相机(1)图像处理
- Java温度转换(写一个将华氏温度转换成摄氏温度的程序)
- x265中的lookahead
- python extension_Python extension.Extension方法代碼示例
- ThoughtWorks HomeWork
- Direcshow中视频捕捉和参数设置报告
- PTT BBS-- 软件人的心路历程分享 (补习计算机、学习写程序、出书、出国、求职...这位前辈都经历过了)...
- Windows的一些溢出题目
- android gsm功能,Android手机-GSM网络与WCDMA网络选择的设置