iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >什么是并行流
  • 320
分享到

什么是并行流

2023-06-15 21:06:40 320人浏览 八月长安
摘要

本篇内容介绍了“什么是并行流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!并行流认识开启并行流并行流是什么?是把一个流内容分成多个数据块,并

本篇内容介绍了“什么是并行流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

并行流

认识开启并行流

并行流是什么?是把一个流内容分成多个数据块,并用不同线程分别处理每个不同数据块的流。例如,有下面一个例子,在List中,需要对List数据进行分别计算,其代码如下所示:

List<Apple> appleList = new ArrayList<>(); // 假装数据是从库里查出来的  for (Apple apple : appleList) {     apple.setPrice(5.0 * apple.getWeight() / 1000); }

在这里,时间复杂度为O(list.size),随着list的增加,耗时也在增加。并行流可以解决这个问题,代码如下所示:

appleList.parallelStream().forEach(apple -> apple.setPrice(5.0 *  apple.getWeight() / 1000));

这里通过调parallelStream()说明当前流为并行流,然后进行并行执行。并行流内部使用了默认的ForkJoinPool线程池,默认线程数为处理器的核心数。

测试并行流

普通代码如下所示:

public static void main(String[] args) throws InterruptedException {     List<Apple> appleList = initAppleList();      Date begin = new Date();     for (Apple apple : appleList) {         apple.setPrice(5.0 * apple.getWeight() / 1000);         Thread.sleep(1000);     }     Date end = new Date();     log.info("苹果数量:{}个, 耗时:{}s", appleList.size(), (end.getTime() - begin.getTime()) /1000); }

输出的内容为耗时4s。

并行代码如下所示:

List<Apple> appleList = initAppleList();  Date begin = new Date(); appleList.parallelStream().forEach(apple ->                                    {                                        apple.setPrice(5.0 * apple.getWeight() / 1000);                                        try {                                            Thread.sleep(1000);                                        } catch (InterruptedException e) {                                            e.printStackTrace();                                        }                                    }                                   ); Date end = new Date(); log.info("苹果数量:{}个, 耗时:{}s", appleList.size(), (end.getTime() - begin.getTime()) /1000);

输出结果为耗时1s。可以看到耗时大大提升了3s。

并行流拆分会影响流的速度

对于并行流来说需要注意以下几点:

  1. 对于 iterate 方法来处理的前 n 个数字来说,不管并行与否,它总是慢于循环的,

  2. 而对于 LongStream.rangeClosed() 方法来说,就不存在 iterate  的第两个痛点了。它生成的是基本类型的值,不用拆装箱操作,另外它可以直接将要生成的数字 1 - n 拆分成 1 - n/4, 1n/4 - 2n/4, ...  3n/4 - n 这样四部分。因此并行状态下的 rangeClosed() 是快于 for 循环外部迭代的

代码如下所示:

package lambdasinaction.chap7;  import java.util.stream.*;  public class ParallelStreams {      public static long iterativeSum(long n) {         long result = 0;         for (long i = 0; i <= n; i++) {             result += i;         }         return result;     }      public static long sequentialSum(long n) {         return Stream.iterate(1L, i -> i + 1).limit(n).reduce(Long::sum).get();     }      public static long parallelSum(long n) {         return Stream.iterate(1L, i -> i + 1).limit(n).parallel().reduce(Long::sum).get();     }      public static long rangedSum(long n) {         return LongStream.rangeClosed(1, n).reduce(Long::sum).getAsLong();     }      public static long parallelRangedSum(long n) {         return LongStream.rangeClosed(1, n).parallel().reduce(Long::sum).getAsLong();     }  } package lambdasinaction.chap7;  import java.util.concurrent.*; import java.util.function.*;  public class ParallelStreamsHarness {      public static final ForkJoinPool FORK_JOIN_POOL = new ForkJoinPool();      public static void main(String[] args) {         System.out.println("Iterative Sum done in: " + measurePerf(ParallelStreams::iterativeSum, 10_000_000L) + " msecs");         System.out.println("Sequential Sum done in: " + measurePerf(ParallelStreams::sequentialSum, 10_000_000L) + " msecs");         System.out.println("Parallel forkJoinSum done in: " + measurePerf(ParallelStreams::parallelSum, 10_000_000L) + " msecs" );         System.out.println("Range forkJoinSum done in: " + measurePerf(ParallelStreams::rangedSum, 10_000_000L) + " msecs");         System.out.println("Parallel range forkJoinSum done in: " + measurePerf(ParallelStreams::parallelRangedSum, 10_000_000L) + " msecs" );     }      public static <T, R> long measurePerf(Function<T, R> f, T input) {         long fastest = Long.MAX_VALUE;         for (int i = 0; i < 10; i++) {             long start = System.nanoTime();             R result = f.apply(input);             long duration = (System.nanoTime() - start) / 1_000_000;             System.out.println("Result: " + result);             if (duration < fastest) fastest = duration;         }         return fastest;     } }

共享变量会造成数据出现问题

public static long sideEffectSum(long n) {     Accumulator accumulator = new Accumulator();     LongStream.rangeClosed(1, n).forEach(accumulator::add);     return accumulator.total; }  public static long sideEffectParallelSum(long n) {     Accumulator accumulator = new Accumulator();     LongStream.rangeClosed(1, n).parallel().forEach(accumulator::add);     return accumulator.total; }  public static class Accumulator {     private long total = 0;      public void add(long value) {         total += value;     } }

并行流的注意

  1. 尽量使用 LongStream / IntStream / DoubleStream 等原始数据流代替 Stream  来处理数字,以避免频繁拆装箱带来的额外开销

  2. 要考虑流的操作流水线的总计算成本,假设 N 是要操作的任务总数,Q 是每次操作的时间。N * Q 就是操作的总时间,Q  值越大就意味着使用并行流带来收益的可能性越大

  3. 对于较少的数据量,不建议使用并行流

  4. 容易拆分成块的流数据,建议使用并行流

“什么是并行流”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 什么是并行流

本文链接: https://www.lsjlt.com/news/281585.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 什么是并行流
    本篇内容介绍了“什么是并行流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!并行流认识开启并行流并行流是什么是把一个流内容分成多个数据块,并用...
    99+
    2023-06-15
  • mongodb执行流程是什么
    MongoDB的执行流程主要包括以下几个步骤:1. 客户端发送命令:客户端向MongoDB发送命令,例如插入文档、查询数据等。2. ...
    99+
    2023-09-06
    MongoDB
  • pycharm并行运行是什么意思
    pycharm 中的并行运行功能允许并发运行代码块,提高开发和测试效率。通过启用该功能和设置进程数,您可以:加快开发和调试过程。缩短测试套件的运行时间。充分利用多核处理器。简化复杂代码的...
    99+
    2024-04-18
    python pycharm
  • cdn为什么是下行流量
    cdn是属于下行流量的。其中,下行流量指的是访问的时候向外发送数据包时所产生的流量;而上行流量是指外部网络向内发送数据所产生的流量。cdn 是构建在网络之上的内容分发网络,是依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度...
    99+
    2024-04-02
  • NPAPI的运行流程是什么
    NPAPI(Netscape Plugin Application Programming Interface)是一种用于浏览器插件...
    99+
    2023-10-24
    NPAPI
  • mapreduce的执行流程是什么
    MapReduce执行流程包括以下步骤: 输入数据划分:输入数据被划分成多个数据块,每个数据块包含若干个记录。 Map阶段:...
    99+
    2024-04-02
  • JavaScript并行运行的函数是什么
    今天小编给大家分享一下JavaScript并行运行的函数是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们...
    99+
    2024-04-02
  • java中并发和并行的概念是什么
    这篇文章主要介绍了java中并发和并行的概念是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可...
    99+
    2023-06-14
  • 怎么理解Java 8并行流
    本篇内容主要讲解“怎么理解Java 8并行流”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Java 8并行流”吧!并行流认识和开启并行流什么是并行流: 并行流就是将一个流的内容分成多个数...
    99+
    2023-06-16
  • Spark中的并行度是指什么
    在Spark中,并行度是指同时运行在集群中的任务的数量。它决定了数据分区和并行处理的程度,影响Spark作业的性能和效率。通过调整并...
    99+
    2024-03-05
    Spark
  • Visual Studio 2010并行特性是什么
    这篇文章将为大家详细讲解有关Visual Studio 2010并行特性是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在以往的计算机发展历史中,硬件技术的发展总是给软件带来免费的性能提...
    99+
    2023-06-17
  • PHP中CodeIgniter的运行流程是什么
    小编给大家分享一下PHP中CodeIgniter的运行流程是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!PHP开发环境搭建工具有哪些一、phpStudy,是...
    99+
    2023-06-14
  • mybatis框架的执行流程是什么
    MyBatis框架的执行流程大致如下: 加载MyBatis配置文件:MyBatis会读取并解析mybatis-config.xm...
    99+
    2024-04-02
  • Golang函数的执行流程是什么?
    go 函数的执行流程如下:分配栈空间,存储局部变量和参数。压栈调用者信息,准备返回。设置局部变量。执行函数体(语句和表达式)。返回值(如果有)。恢复调用者信息。释放栈空间。控制权返回给调...
    99+
    2024-04-11
    golang 函数执行流程
  • django框架的运行流程是什么
    Django框架的运行流程主要包括以下几个步骤:1. 客户端发送请求:用户在浏览器中输入URL地址或点击链接,向服务器发送HTTP请...
    99+
    2023-10-07
    django
  • PostgreSQL中执行sql的流程是什么
    小编给大家分享一下PostgreSQL中执行sql的流程是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、SQL执行流程PG执行SQL的过程有以下几个步骤:第一步,根据输入的SQL语...
    99+
    2024-04-02
  • swoole协程的执行流程是什么
    今天小编给大家分享一下swoole协程的执行流程是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在swoole中,Swo...
    99+
    2023-06-29
  • 什么是Teradata的并行处理架构
    Teradata的并行处理架构是一种数据仓库架构,它采用了共享-nothing架构。在这种架构下,数据被分割成多个部分,每个部分被存...
    99+
    2024-04-09
    Teradata
  • sql多行合并成一行的方法是什么
    在SQL中,可以使用GROUP BY子句和聚合函数来将多行合并为一行。 例如,假设有以下数据: id name 1 Joh...
    99+
    2024-04-09
    sql
  • oracle并行查询的方法是什么
    Oracle并行查询的方法有以下几种:1. 使用并行提示:在SQL语句中使用提示来指定并行查询的表和并行度。例如,SELECT...
    99+
    2023-09-26
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作