读Java8函数式编程笔记05_数据并行化
1. 并发
1.1. 两个任务共享时间段
1.2. 一个程序要运行两个任务,并且只有一个CPU给它们分配了不同的时间片,那么这就是并发,而不是并行
2. 并行
2.1. 两个任务在同一时间发生
2.2. 为缩短任务执行时间,将一个任务分解成几部分,然后并行执行
2.3. 和顺序执行的任务量是一样的,区别就像用更多的马来拉车,花费的时间自然减少了
2.4. 重要
2.4.1. 不能再依赖提升CPU的时钟频率来提高现有代码的计算能力
2.4.2. 需要利用现代CPU的架构,而这唯一的办法就是编写并行化的代码
2.4.3. 阿姆达尔定律
2.4.3.1. 一个简单规则,预测了搭载多核处理器的机器提升程序速度的理论最大值
2.5. 优化任何和计算相关的任务立即变成了如何有效利用现有硬件的问题
3. 数据并行化
3.1. 将数据分成块,为每块数据分配单独的处理单元
3.2. 把工作拆分,同时在多核CPU上执行的方式
3.3. 调用parallel或者parallelStream方法实现数据并行化操作
4. 任务并行化
4.1. 线程不同,工作各异
4.2. Java EE应用容器
5. 并行化流操作
5.1. 在一个四核电脑上
5.1.1. 10张专辑
5.1.1.1. 串行化代码的速度是并行化代码速度的8倍
5.1.2. 100张专辑
5.1.2.1. 串行化和并行化速度相当
5.1.3. 10000张专辑
5.1.3.1. 并行化代码的速度是串行化代码速度的2.5倍
5.2. 速度提升的因素
5.2.1. 输入流的大小
5.2.2. 编写代码的方式
5.2.3. 核的数量
5.3. 底层
5.3.1. 并行流还是沿用了fork/join框架
5.3.1.1. fork递归式地分解问题,然后每段并行执行
5.3.1.2. 最终由join合并结果,返回最后的值
6. 模拟系统
6.1. 使用简单操作处理大量数据
6.2. 蒙特卡洛模拟法
6.2.1. 用在工程、金融和科学计算领域
7. 限制
7.1. 代码写得符合约定
7.2. 初值必须为组合函数的恒等值
7.2.1. 求和操作初值必须为0,因为任何数字加0,值不变
7.3. 组合操作必须符合结合律
7.3.1. 只要序列的值不变,组合操作的顺序不重要
7.4. parallel
7.5. sequential
7.6. 最后调用的那个方法起效
8. 性能
8.1. 数据大小
8.1.1. 只有数据足够大、每个数据处理管道花费的时间足够多时,并行化处理才有意义
8.2. 源数据结构
8.2.1. 每个管道的操作都基于一些初始数据源,通常是集合
8.2.2. 将不同的数据源分割相对容易
8.3. 装箱
8.3.1. 处理基本类型比处理装箱类型要快
8.4. 核的数量
8.4.1. 核越多,获得潜在性能提升的幅度就越大
8.4.2. 核的数量不单指你的机器上有多少核,更是指运行时你的机器能使用多少核。这也就是说同时运行的其他进程,或者线程关联性(强制线程在某些核或CPU上运行)会影响性能
8.5. 单元处理开销
8.5.1. 花在流中每个元素身上的时间越长,并行操作带来的性能提升越明显
8.5.2. 处理每个元素所花的时间
8.6. 通用数据结构性能
8.6.1. 性能好
8.6.1.1. ArrayList
8.6.1.2. 数组
8.6.1.3. IntStream.range
8.6.1.4. 支持随机读取,也就是说它们能轻而易举地被任意分解
8.6.2. 性能一般
8.6.2.1. HashSet
8.6.2.2. TreeSet
8.6.2.3. 不易公平地被分解,但是大多数时候分解是可能的
8.6.3. 性能差
8.6.3.1. LinkedList
8.6.3.2. Streams.iterate
8.6.3.3. BufferedReader.lines
8.6.3.4. 难于分解
8.7. 无状态操作
8.7.1. 整个过程中不必维护状态
8.7.2. map
8.7.3. filter
8.7.4. flatMap
8.8. 有状态操作
8.8.1. 有维护状态所需的开销和限制
8.8.2. sorted
8.8.3. distinct
8.8.4. limit
9. 工具类Arrays
读Java8函数式编程笔记05_数据并行化的更多相关文章
- 关于Java8函数式编程你需要了解的几点
函数式编程与面向对象的设计方法在思路和手段上都各有千秋,在这里,我将简要介绍一下函数式编程与面向对象相比的一些特点和差异. 函数作为一等公民 在理解函数作为一等公民这句话时,让我们先来看一下一种非常常 ...
- Java8函数式编程探秘
引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和.最大值.最小值.平均值.元素个数.奇偶分组.指数.排序呢? 答案是思维反转!将行为作为数据传递. 文艺青年的代码如下所示: public ...
- [2017.02.23] Java8 函数式编程
以前学过Haskell,前几天又复习了其中的部分内容. 函数式编程与命令式编程有着不一样的地方,函数式编程中函数是第一等公民,通过使用少量的几个数据结构如list.map.set,以及在这些数据结构上 ...
- Java8 函数式编程详解
Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...
- java8函数式编程(转载)
1. 概述 1.1 函数式编程简介 我们最常用的面向对象编程(Java)属于命令式编程(Imperative Programming)这种编程范式.常见的编程范式还有逻辑式编程(Logic Progr ...
- Java8函数式编程的宏观总结
1.java8优势通过将行为进行抽象,java8提供了批量处理数据的并行类库,使得代码可以在多核CPU上高效运行. 2.函数式编程的核心使用不可变值和函数,函数对一个值进行处理,映射成另一个值. 3. ...
- [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念
本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的 ...
- java8函数式编程实例
什么是函数式编程 函数式编程是java8的一大特色,也就是将函数作为一个参数传递给指定方法.别人传的要么是基本数据类型,要么就是地址引用 ,我们要穿一个“动作”. Stream 说到函数式编程,就不得 ...
- Java8函数式编程以及Lambda表达式
第一章 认识Java8以及函数式编程 尽管距离Java8发布已经过去7.8年的时间,但时至今日仍然有许多公司.项目停留在Java7甚至更早的版本.即使已经开始使用Java8的项目,大多数程序员也仍然采 ...
- 漫漫人生路,学点Jakarta基础-Java8函数式编程
接口默认方法 Java8版本以后新增了接口的默认方法,不仅仅只能包含抽象方法,接口也可以包含若干个实例方法.在接口内定义实例方法(但是注意需要使用default关键字) 在此定义的方法并非抽象方法,而 ...
随机推荐
- miniconda使用
基本指令 conda create -n xxx python=3.7 // 创建Python3.7的名为xxx虚拟环境 conda env list // 显示所有的虚拟环境 conda activ ...
- onps栈移植说明(3)——添加网卡
4. 添加网卡 移植的最后一步就是编写网卡驱动然后将网卡添加到协议栈.网卡驱动其本质上完成的是数据链路层的工作,在整个通讯链路上处于通讯枢纽位置,通讯报文的发送和接收均由其实际完成.针对网卡部分的移植 ...
- 真正“搞”懂HTTP协议03之时间穿梭
上一篇我们简单的介绍了一下DoD模型和OSI模型,还着重的讲解了TCP的三次握手和四次挥手,让我们在空间层面,稍稍宏观的了解了HTTP所依赖的底层模型,那么这一篇,我们来追溯一下HTTP的历史,看一看 ...
- pinpoint:查看hbase表和修改数据过期时间
先做个记录,监控数据量过大时可以设置表的数据过期时间来清理数据. 1. 查找本地数据表大小 [root@ZWZF-CWY-LZY-12 ~]# cd /home/pinpoint/hbase/data ...
- pagehelper使用有误导致sql多了一个limit
接口测试报告中发现时不时有一个接口报错,但再跑一次又没有这个报错了.报错信息是sql异常,sql中有两个limit.查看后台代码和XXmapper.xml,发现确实只有一个limit.一开始开发以为是 ...
- perl 之 join和 split
转载 perl 之 join和 split
- 记一次mybatis性能问题分析过程
说明 今天发现个2个问题,一是mybatisplus执行一条某个字段值比较长(约1.8M的文本)的INSERT语句耗时要90s+;二是读取这个1.8M文本返回给前端耗时6min.查查查查了半天搞不清楚 ...
- 前后端结合解决Excel海量公式计算的性能问题
背景 在数据密集的业务领域,尤其是金融,保险,税务等行业中,经常需要利用Excel模型,来对业务进行分析和处理.例如: 1.金融投资: 根据模型进行估值计算,并对投资风险进行评估,通过测算出投资的内部 ...
- 编译安装oh-my-zsh
1.前言 oh-my-zsh是基于zsh的一套美化工具,其内部也提供很多主题以及插件.github介绍 2.有啥用 对我来说可能查看git分支更加直观,另外其强大的补全功能 又或者更加直观的查看上一条 ...
- 【图像处理笔记】SIFT算法原理与源码分析
[图像处理笔记]总目录 0 引言 特征提取就是从图像中提取显著并且具有可区分性和可匹配性的点结构.常见的点结构一般为图像内容中的角点.交叉点.闭合区域中心点等具有一定物理结构的点,而提取点结构的一般思 ...