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_数据并行化的更多相关文章

  1. 关于Java8函数式编程你需要了解的几点

    函数式编程与面向对象的设计方法在思路和手段上都各有千秋,在这里,我将简要介绍一下函数式编程与面向对象相比的一些特点和差异. 函数作为一等公民 在理解函数作为一等公民这句话时,让我们先来看一下一种非常常 ...

  2. Java8函数式编程探秘

    引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和.最大值.最小值.平均值.元素个数.奇偶分组.指数.排序呢? 答案是思维反转!将行为作为数据传递. 文艺青年的代码如下所示: public ...

  3. [2017.02.23] Java8 函数式编程

    以前学过Haskell,前几天又复习了其中的部分内容. 函数式编程与命令式编程有着不一样的地方,函数式编程中函数是第一等公民,通过使用少量的几个数据结构如list.map.set,以及在这些数据结构上 ...

  4. Java8 函数式编程详解

    Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...

  5. java8函数式编程(转载)

    1. 概述 1.1 函数式编程简介 我们最常用的面向对象编程(Java)属于命令式编程(Imperative Programming)这种编程范式.常见的编程范式还有逻辑式编程(Logic Progr ...

  6. Java8函数式编程的宏观总结

    1.java8优势通过将行为进行抽象,java8提供了批量处理数据的并行类库,使得代码可以在多核CPU上高效运行. 2.函数式编程的核心使用不可变值和函数,函数对一个值进行处理,映射成另一个值. 3. ...

  7. [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念

      本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程?   java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的 ...

  8. java8函数式编程实例

    什么是函数式编程 函数式编程是java8的一大特色,也就是将函数作为一个参数传递给指定方法.别人传的要么是基本数据类型,要么就是地址引用 ,我们要穿一个“动作”. Stream 说到函数式编程,就不得 ...

  9. Java8函数式编程以及Lambda表达式

    第一章 认识Java8以及函数式编程 尽管距离Java8发布已经过去7.8年的时间,但时至今日仍然有许多公司.项目停留在Java7甚至更早的版本.即使已经开始使用Java8的项目,大多数程序员也仍然采 ...

  10. 漫漫人生路,学点Jakarta基础-Java8函数式编程

    接口默认方法 Java8版本以后新增了接口的默认方法,不仅仅只能包含抽象方法,接口也可以包含若干个实例方法.在接口内定义实例方法(但是注意需要使用default关键字) 在此定义的方法并非抽象方法,而 ...

随机推荐

  1. 安装zabbix-agent2之ansible-playbook

    zabbix被监控端安装zabbix-agent2之ansible-playbook --- - name: install agent hosts: all vars: server_host: & ...

  2. 【深入浅出 Yarn 架构与实现】2-2 Yarn 基础库 - 底层通信库 RPC

    RPC(Remote Procedure Call) 是 Hadoop 服务通信的关键库,支撑上层分布式环境下复杂的进程间(Inter-Process Communication, IPC)通信逻辑, ...

  3. jvm之自动内存管理

    一.运行时数据区 程序计数器(线程私有) 1.程序计数器占用jvm内存较小,主要用来记录当前线程所执行的字节码的位置,因为jvm的多线程都是通过cpu对线程进行来回切换,所以在某个确定的时间cpu只会 ...

  4. vue引用MarkDown(mavonEditor)编辑器,文档

    mavonEditor Install mavon-editor (安装) npm install mavon-editor --save 如何引入: 全局引用: // 全局注册 import Vue ...

  5. 操作系统课程设计pintos project1实验摘记

    第一部分 项目概述 一.Pintos简介 Pintos是一个基于80x86架构的简单操作系统框架,它支持内核级线程.能够加载和运行用户程序,也拥有文件系统,不过,这些功能均以一种简单的形式实现. 二. ...

  6. 使用vite + vue3 + ant-design-vue + vue-router + vuex 创建一个后台管理应用

    使用vite + vue3 + ant-design-vue + vue-router + vuex 创建一个管理应用的记录 使用vite 创建项目 我创建的node 版本是 v16.17.1 使用N ...

  7. 数电第三周周结_by_yc

    主要内容:Modelsim和Quartus的使用坑点 Modelsim: 新建Project:   在每新建一个verilog文件时,均需要添加一project的独立路径,否则不同文件之间会相互影响! ...

  8. 【每日一题】【回溯】【StringBuilder】2021年12月7日-17. 电话号码的字母组合

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合.答案可以按 任意顺序 返回. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 来源:力扣(LeetCode)链 ...

  9. Django框架F查询与Q查询(全面了解)

    一:F与Q查询 1.F查询的作用 能够帮助你直接获取到列表中某个字段对应的数据 注意: 在操作字符串类型的数据的时候, F不能够直接做到字符串的拼接 2.查询卖出书大于库存数的书籍 # 导入F查询 f ...

  10. uni框架引入外部图标

    说明 在使用uni框架的uni-nav-bar自定义导航栏的时候我想要引用外部的图标,但是似乎这个好像只能引入uni框架内置的图标 所以我只能把uni的图标进行增加处理,这样引入图标的方式就和正常的引 ...