读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关键字) 在此定义的方法并非抽象方法,而 ...
随机推荐
- JAVA-注解之 TODO、FIXME、XXX
TODO.FIXME.XXX //TODO : 表示待实现的功能 //FIXME: 代码存在Bug,不能Run或运行结果不正确,需要修复 //XXX : 勉强可以工作,但是实现的方 ...
- 2022春每日一题:Day 35
题目:[NOI Online #1 提高组] 冒泡排序 看到范围这么大,求逆序对,有修改,估计也只能树状数组了,考查冒泡排序性质,排第i次冒泡排序,总逆序对个数会减少i的逆序对个数,然后交换两个数,他 ...
- 如何精简 Prometheus 的指标和存储占用
前言 随着 Prometheus 监控的组件.数量.指标越来越多,Prometheus 对计算性能的要求会越来越高,存储占用也会越来越多. 在这种情况下,要优化 Prometheus 性能, 优化存储 ...
- C++初阶(封装+多态--整理的自认为很详细)
继承 概念:继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单 ...
- 1、Docker最新入门教程-Docker概述
1. Docker概述 Docker 是一个用于开发.运输和运行应用程序的开放平台.Docker 使您能够将应用程序与基础架构分开,以便您可以快速交付软件.使用 Docker,您可以像管理应用程序一样 ...
- AcWing第78场周赛
今天想起来了,就补一下吧~ 第一题 商品分类 货架中摆放着 n 件商品,每件商品都有两个属性:名称和产地. 当且仅当两件商品的名称和产地都相同时,两件商品才视为同一种商品. 请你统计,货架中一共有多少 ...
- 2022csp普及组真题:解密(decode)
2022csp普及组真题:解密(decode) 题目 [题目描述] 给定一个正整数 k,有 k 次询问,每次给定三个正整数 ni , ei , di,求两个正整数 pi , qi, 使 ni = pi ...
- Multipass,本地轻量级Linux体验!
Multipass介绍 Multipass 是由Ubuntu官方提供,在Linux,MacOS和Windows上快速生成 Ubuntu虚拟机 的工具.它提供了一个简单但功能强大的CLI,可让我们在本地 ...
- 谁说.NET没有GC调优?只改一行代码就让程序不再占用内存
经常看到有群友调侃"为什么搞Java的总在学习JVM调优?那是因为Java烂!我们.NET就不需要搞这些!"真的是这样吗?今天我就用一个案例来分析一下. 昨天,一位学生问了我一个问 ...
- MISC中的图片修改宽高问题
在做CTF中MISC分类题目时,很常见的一个问题就是修改图片正确的宽与高 (此篇笔记中的内容以ctfshow中MISC入门分类为切入点,感兴趣的同学可以一边做一边有不会的看看,仅供参考,我是菜鸡) 曾 ...