百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

读Java实战(第二版)笔记15_并行数据处理与性能

lipiwang 2024-11-22 17:21 4 浏览 0 评论

1.Stream

1.1.允许你声明性地将顺序流转变成并行流

1.2.能对这些集合执行操作流水线,可以充分利用计算机的多个核

2.并行流

2.1.把内容拆分成多个数据块,用不同线程分别处理每个数据块的流

2.2.自动地把工作负荷分配到多核处理器的所有核

2.3.内部迭代让你可以并行处理一个流,而无须在代码中显式使用和协调不同的线程

2.4.对顺序流调用parallel方法,你可以将流转换成并行流

2.5.并行流调用sequential方法就可以把它变成顺序流

2.6.最后一次parallel或sequential调用会影响整个流水线

2.7.内部使用了默认的ForkJoinPool

2.7.1.默认的线程数量就是你的处理器数量

2.7.2.Runtime.getRuntime().availableProcessors()得到

2.7.3.java.util.concurrent.ForkJoinPool.common.parallelism来修改线程池大小

3.Java微基准套件

3.1.Java microbenchmark harness, JMH

3.2.一个以声明方式帮助大家创建简单、可靠微基准测试的工具集

3.3.支持Java

3.4.支持可以运行在Java虚拟机(Java virtual machine, JVM)上的其他语言

3.5.选择适当的数据结构往往比并行化算法更重要

3.5.1.LongStream.rangeClosed

3.6.并行软件的行为和性能有时是违反直觉的,因此一定要测量,确保你并没有把程序拖得更慢

4.并行化的代价

4.1.并行化过程本身需要对流做递归划分

4.2.把每个子流的归约操作分配到不同的线程

4.3.然后把这些操作的结果合并成一个值

4.4.多个核之间移动数据的代价也可能比你想的要大

4.4.1.保证在核中并行执行工作的时间比在核之间传输数据的时间长

4.5.很多情况下不可能或不方便并行化

4.5.1.如果结果错了,算得快就毫无意义了

5.高效使用并行流

5.1.适用于要处理的元素数量庞大,或处理单个元素特别耗时的时候

5.2.并行流并不总是比顺序流快

5.2.1.用适当的基准来检查其性能

5.3.自动装箱和拆箱操作会大大降低性能

5.4.有些操作本身在并行流上的性能就比顺序流差

5.4.1.limit和findFirst等依赖于元素顺序的操作

5.4.2.findAny会比findFirst性能好,因为它不一定要按顺序来执行

5.5.调用unordered方法来把有序流变成无序流

5.5.1.对无序并行流调用limit可能会比单个有序流(比如数据源是一个List)更高效

5.6.流的操作流水线的总计算成本

5.6.1.设N是要处理的元素的总数,Q是一个元素通过流水线的大致处理成本,则N*Q就是这个对成本的一个粗略的定性估计

5.6.2.Q值较高就意味着使用并行流时性能好的可能性比较大

5.7.对于较小的数据量,选择并行流几乎从来都不是一个好的决定

5.8.流背后的数据结构是否易于分解

5.8.1.ArrayList的拆分效率比LinkedList高得多

5.9.终端操作中合并步骤的代价是大是小

6.分支/合并框架

6.1.分治算法的并行版本

6.2.以递归方式将可以并行的任务拆分成更小的任务,然后将每个子任务的结果合并起来生成整体结果

6.3.ExecutorService接口的一个实现,它把子任务分配给线程池(称为ForkJoinPool)中的工作线程

6.4.对一个任务调用join方法会阻塞调用方,直到该任务做出结果

6.5.不应该在RecursiveTask内部使用ForkJoinPool的invoke方法

6.6.应该始终直接调用compute或fork方法,只有顺序代码才应该用invoke来启动并行计算

6.7.对子任务调用fork方法可以把它排进ForkJoinPool

6.8.工作窃取

6.8.1.随机选了一个别的线程,从队列的尾巴上“偷走”一个任务

7.Spliterator

7.1.一种自动机制来为你拆分流

7.2.代表“可分迭代器”(splitable iterator)

7.3.用于遍历数据源中的元素,但它是为了并行执行而设计的

7.4.特性是通过characteristics方法声明的

7.5.Java没有元组(tuple,用来表示由异类元素组成的有序列表的结构,不需要包装对象),所以你必须创建一个新类来把状态封装起来

相关推荐

ubuntu单机安装open-falcon极度详细操作

备注:以下操作均由本人实际操作并得到验证,喜欢的同学可尝试操作安装。步骤一1.1环境准备(使用系统:ubuntu18.04)1.1.1安装redisubuntu下安装(参考借鉴:https://...

Linux搭建promtail、loki、grafana轻量日志监控系统

一:简介日志监控告警系统,较为主流的是ELK(Elasticsearch、Logstash和Kibana核心套件构成),虽然优点是功能丰富,允许复杂的操作。但是,这些方案往往规模复杂,资源占用高,...

一文搞懂,WAF阻止恶意攻击的8种方法

WAF(Web应用程序防火墙)是应用程序和互联网流量之间的第一道防线,它监视和过滤Internet流量以阻止不良流量和恶意请求,WAF是确保Web服务的可用性和完整性的重要安全解决方案。它...

14配置appvolume(ios14.6配置文件)

使用AppVolumes应用程序功能,您可以管理应用程序的整个生命周期,包括打包、更新和停用应用程序。您还可以自定义应用程序分配,以向最终用户提供应用程序的特定版本14.1安装appvolume...

目前流行的缺陷管理工具(缺陷管理方式存在的优缺点)

摘自:https://blog.csdn.net/jasonteststudy/article/details/7090127?utm_medium=distribute.pc_relevant.no...

开源数字货币交易所开发学习笔记(2)——SpringCloud

前言码云(Gitee)上开源数字货币交易所源码CoinExchange的整体架构用了SpringCloud,对于经验丰富的Java程序员来说,可能很简单,但是对于我这种入门级程序员,还是有学习的必要的...

开发JAX-RPC Web Services for WebSphere(下)

在开发JAX-RPCWebServicesforWebSphere(上)一文中,小编为大家介绍了如何创建一个Web服务项目、如何创建一个服务类和Web服务,以及部署项目等内容。接下来小编将为大...

CXF学习笔记1(cxf client)

webservice是发布服务的简单并实用的一种技术了,个人学习了CXF这个框架,也比较简单,发布了一些笔记,希望对笔友收藏并有些作用哦1.什么是webServicewebService让一个程序可...

分布式RPC最全详解(图文全面总结)

分布式通信RPC是非常重要的分布式系统组件,大厂经常考察的Dubbo等RPC框架,下面我就全面来详解分布式通信RPC@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》...

Oracle WebLogic远程命令执行0day漏洞(CVE-2019-2725补丁绕过)预警

概述近日,奇安信天眼与安服团队通过数据监控发现,野外出现OracleWebLogic远程命令执行漏洞最新利用代码,此攻击利用绕过了厂商今年4月底所发布的最新安全补丁(CVE-2019-2725)。由...

Spring IoC Container 原理解析(spring中ioc三种实现原理)

IoC、DI基础概念关于IoC和DI大家都不陌生,我们直接上martinfowler的原文,里面已经有DI的例子和spring的使用示例《InversionofControlContainer...

Arthas线上服务器问题排查(arthas部署)

1Arthas(阿尔萨斯)能为你做什么?这个类从哪个jar包加载的?为什么会报各种类相关的Exception?我改的代码为什么没有执行到?难道是我没commit?分支搞错了?遇到问题无法在...

工具篇之IDEA功能插件HTTP_CLENT(idea2021插件)

工具描述:Java开发人员通用的开发者工具IDEA集成了HTTPClient功能,之后可以无需单独安装使用PostMan用来模拟http请求。创建方式:1)简易模式Tools->HTTPCl...

RPC、Web Service等几种远程监控通信方式对比

几种远程监控通信方式的介绍一.RPCRPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果。这个请求包括一个参数集和一个文本集,通常形成“classname.meth...

《github精选系列》——SpringBoot 全家桶

1简单总结1SpringBoot全家桶简介2项目简介3子项目列表4环境5运行6后续计划7问题反馈gitee地址:https://gitee.com/yidao620/springbo...

取消回复欢迎 发表评论: