读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关键字) 在此定义的方法并非抽象方法,而 ... 
随机推荐
- 如何解读Linux Kernel OOPS信息
			OOPS信息解读 root@firefly:~/mnt/module# insmod oops_module.ko [ 867.140514] Unable to handle kernel NULL ... 
- java学习之IO流
			java io流有四大家族分别是: 1.InputStream(字节输入流) 2.OutputStream(字节输入出流)3.Reader(字符输入流)4.Writer(字符输出流)四个类都是抽象类 ... 
- @Retryable注解的使用
			@Retryable 前言 在实际工作中,重处理是一个非常常见的场景,比如: 发送消息失败. 调用远程服务失败. 争抢锁失败. 这些错误可能是因为网络波动造成的,等待过后重处理就能成功.通常来说,会用 ... 
- Java标准类
			一个标准的类通常要拥有以下四个组成部分 1.所有的成员变量都要使用private关键字修饰 2.为每一个成员变量编写一对儿Getter/Setter方法 3.编写一个无参数的构造方法 4.编写一个全参 ... 
- Dubbo-Activate实现原理
			前言 在Dubbo中有Filter使用,对于Filter来说我们会遇到这样的问题,Filter自身有很多的实现,我们希望某种条件下使用A实现,另外情况下使用B实现,这个时候我们前面介绍@SPI和@Ad ... 
- Day22:多态详解
			方法的多态 1.1什么是多态? 指一个对象在不同时刻拥有不同的形态. 例:猫 cat=new 猫():  动物 animal=new 猫(): 多态建立的条件: 建立在继承的关系上: 有方法重写: ... 
- Selenium4+Python3系列(十) -  Page Object设计模式
			前言 Page Object(PO)模式,是Selenium实战中最为流行,并且被自动化测试同学所熟悉和推崇的一种设计模式之一.在设计测试时,把页面元素定位和元素操作方法按照页面抽象出来,分离成一定的 ... 
- fiddler提示"The system proxy was changed,click to reenable fiddler capture"的解决方法
			之前用fiddler 一直都是正常的,但是过了几个月再次使用的时候没几秒钟就提示:The system proxy was changed,click to reenable fiddler capt ... 
- Linux创建定时删除日志任务
			定时删除3天前的所有日志文件: 1.例:脚本对应的要删除的目录为/home/logs在home目录创建文件clearLogFiles.sh:cd /homevim clearLogFiles.sh写入 ... 
- 2.5:Python常用内置数据结构、多维数组ndarray、Series和DataFrame
			一.Python内置数据结构 1.赋值生成列表 la=[1,2,3,4] la 2.强制转换为列表 lb=list("Hello") lb 3.推导式生成列表 s="ab ... 
