读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关键字) 在此定义的方法并非抽象方法,而 ...
随机推荐
- Vue3的新特性
总概 1) 性能提升 打包大小减少 41% 初次渲染快 55%,更新渲染快 133% 内存减少 54% 使用 Proxy 代替 defineProperty 实现数据响应式 重写虚拟 DOM 的实现和 ...
- DNS 解析 prefeath
本文将详细介绍DNS预解析prefetch的主要内容 概述 DNS(Domain Name System, 域名系统),是域名和IP地址相互映射的一个分布式数据库.DNS 查询就是将域名转换成 IP ...
- 造个Python轮子,实现根据Excel生成Model和数据导入脚本
前言 最近遇到一个需求,有几十个Excel,每个的字段都不一样,然后都差不多是第一行是表头,后面几千上万的数据,需要把这些Excel中的数据全都加入某个已经上线的Django项目 这就需要每个Exce ...
- 阿里技术专家详解 DDD 系列- Domain Primitive
简介: 关于DDD的一系列文章,希望能继续在总结前人的基础上发扬光大DDD的思想,但是通过一套我认为合理的代码结构.框架和约束,来降低DDD的实践门槛,提升代码质量.可测试性.安全性.健壮性. 作者| ...
- HDLBits答案——Getting started
Getting started 1 Step one module top_module( output one ); // Insert your code here assign one = 1' ...
- 1. PyQt5开发环境的搭建
专栏地址 ʅ(‾◡◝)ʃ 因为我个人使用的是 Linux 还有之前用过Windows 没用过 Mac 所以这里我简单结束 Linux 和 Windows 开发环境的搭建 Windows 开发PyQt5 ...
- Tekton 设计简介 及 实践
本文是我对Tekton的实现原理和背后技术逻辑的理解,以及在实践过程中的一些总结. 简介 Tekton 是一个基于 Kubernetes 的云原生 CI/CD 开源(https://cd.founda ...
- 【Hadoop面试】基础概念、HDFS、MapReduce、Yarn、实战
一.Hadoop概念及架构 1.是否看过Hadoop源码 2.正常工作的hadoop集群中hadoop都分别需要启动哪些进程,他们的作用分别是什么 3.hadoop和spark中的文件缓存方式 4.h ...
- gulp报错The following tasks did not complete
代码如下: //引用gulp模块 const gulp = require('gulp'); //使用gulp.task()建立任务 gulp.task('first', () => { con ...
- for循环结构、range方法
目录 今日内容总结 whlie补充说明 for循环结构 range方法 练习 今日内容总结 whlie补充说明 1.死循环 真正死循环是一旦执行 CPU功耗会急速上升 直到系统采取紧急措施 尽量不要让 ...