Jody Domingre 多莫歌·乔迪

“How you doing, dummy?” 你还好吗,傻瓜

一、基本介绍

Java8不仅增加了Stream,而且还增加了parallelStream(并行流)。除并行流外,对于普通数组,Java8提供了也简单的并行功能。数组排序,一般使用Arrays.sort()方法串行排序,Java8新增方法Arrays.parallelSort()并行排序。

二、使用

1、parallelSort()

Java 8新增加了很多方法支持并行的数组处理。最重要的大概是parallelSort()这个方法显著地使排序在多核计算机上速度加快。下面的小例子演示了这个新的方法(parallelXXX)的行为。

这一小段代码使用parallelSetAll() t方法填充这个长度是2000的数组,然后使用parallelSort() 排序。这个程序输出了排序前和排序后的10个数字来验证数组真的已经被排序了。示例可能的输出如下(请注意这些数字是随机产生的)

import java.util.Arrays;

import java.util.concurrent.ThreadLocalRandom;

public class ParallelArrays {

public static void main( String[] args ) {

long[] arrayOfLong = new long [ 20000 ];

Arrays.parallelSetAll( arrayOfLong,

index -> ThreadLocalRandom.current().nextInt( 1000000 ) );

Arrays.stream( arrayOfLong ).limit( 10 ).forEach(

i -> System.out.print( i + " " ) );

System.out.println();

Arrays.parallelSort( arrayOfLong );

Arrays.stream( arrayOfLong ).limit( 10 ).forEach(

i -> System.out.print( i + " " ) );

System.out.println();

}

}

2、并行流使用

Map> groupByPrimary = numbers//根据特定的条件(比如:素数和非素数)对数组进行分组

.parallelStream().collect(Collectors.groupingBy(s -> Utility.isPrime(s)));

Integer[] prims = numbers.parallelStream().filter(s -> Utility.isPrime(s)) //对数组进行过滤

.toArray();

三、性能测试

它的性能如何?

为了测试这些并行操作API的性能, 我在两种情况(低竞争和高竞争)下进行了实验。原因是单独运行一个多核算法,往往会有好的性能,但在真实的服务器环境中运行,情况就完全不同了。真实环境中往往有大量的线程在竞争宝贵的CPU时间片以处理消息或用户请求,由于竞争的存在,程序的性能就降低了。所以我进行了接下来的测试。我首先随机生成了长度为100K的整数数组,这些整数的取值在0到1百万之间。然后我分别使用传统的顺序方法和新的Java 8的并行API对这个数组进行了排序,分组和过滤。结果并不使人惊讶。

快速排序快了4.7倍

分组快了5倍

过滤快了5.5倍

这可以说明java 8的并行API具有非常好的性能吗?很不幸,不能。

*测试结果与运行了100次的附加测试结果一致。

*测试机器为MBP,i7四核。

在有负载的情况下会发生什么呢?

目前为止新API的性能表现非常出色,原因是线程之间对CPU的时间片的竞争非常少。这是理想的环境,但不行的是,理想环境往往不会出现在现实环境中。为了模拟真实的环境,我建立了第二个测试。这次测试使用跟第一次相同的算法,但测试任务在十个并发线程上执行,以模拟处在压力环境中的服务器同时处理十个请求的情况。这十个请求使用传统的顺利处理方法或Java 8的新API处理。

测试结果

排序现在只快了20%

过滤现在只快了20%

分组现在满了15%

更高的规模和竞争水平很可能使这些数字进一步下降。原因是在一个多线程的环境中添加线程并不一定能帮助你提高计算效率,是计算机的CPU个数决定了计算效率,而不是线程个数。

结论

虽然这些都是非常强大和易于使用的API,但它们不是银弹。我们仍然需要花费精力去判断何时应该使用它们。如果你事先知道你会做多个处理并行操作,那么考虑使用排队架构,并使并发操作数和你的处理器数量相匹配可能是一个好主意。这里的难点在于运行时性能将依赖于实际的硬件体系结构和服务器所处的压力情况。你可能只有在压力测试或者生产环境中才能看到代码的运行时性能,使之成为一个“易编码,难调试”的经典案例。

参考链接:

http://www.importnew.com/11113.html

图片来源:八恶人(movie)

java 8 并行_Java 8新特性之 并行和并行数组(八恶人-8)相关推荐

  1. java se7 变化_Java SE7新特性之二进制字面量

    Java SE 7中, 整数类型(byte, short, int以及long) 也可以使用二进制数系来表示.要指定一个二进制字面量,可以给二进制数字添加前缀 0b 或者 0B.下面的示例展示了一些二 ...

  2. java 文档比较功能_Java 12 新特性介绍,快来补一补

    Java 12 早在 2019 年 3 月 19 日发布,它不是一个长久支持(LTS)版本.在这之前我们已经介绍过其他版本的新特性,如果需要可以点击下面的链接进行阅读. Switch 表达式 (JEP ...

  3. Java9发布回顾Java 8的十大新特性

    java9已经在北京时间9月22日正式发布,开发者可以在oracle jdk官网上下载到最新的jdk9. 今天,我们先来一起复习一下2014年发布的Java 8的十大新特性.先来喝杯java~~~ 按 ...

  4. Java 10的10个新特性,将彻底改变你写代码的方式

    转载自 Java 10的10个新特性,将彻底改变你写代码的方式 Java 9才发布几个月,很多玩意都没整明白,现在Java 10又要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,J ...

  5. [转载] Java9发布回顾Java 8的十大新特性

    参考链接: Java中的DoubleStream mapToObj() java9已经在北京时间9月22日正式发布,开发者可以在oracle jdk官网上下载到最新的jdk9. 今天,我们先来一起复习 ...

  6. 5分钟学会Java 9~Java11的七大新特性

    Java11 发布了,然而很多公司还在用Java 8 ,本文会简要介绍Java 9 -11 引入的新语法和API. 本地变量类型推断 Java 10 就已经引入了新关键词var,该关键词可以在声明局部 ...

  7. Java基础:JDK1.5新特性

    1. ENUM枚举 1.1 枚举概述 枚举是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.举例:一周只有7天,一年只有12个月等. 回想单例设计模式:单例类是一个类只有一个实例 那么多例 ...

  8. JDK18 Java 18 拥有 9 个新特性

    Java 开发工具包 (JDK) 18 将于 2022 年 3 月 22 日发布.新版本的标准 Java 将有九个新特性,该特性集已于 12 月 9 日冻结,进入Rampdown第一阶段 . 值得注意 ...

  9. JAVA 18 拥有 9 个新特性,JDK18

    Oracle 正式推出Java 18,这是世界排名第一的编程语言和开发平台的最新版本.Java 18 (Oracle JDK 18) 提供了数以千计的性能.稳定性和安全性改进,包括对平台的九项增强(J ...

最新文章

  1. LeetCode简单题之找到小镇的法官
  2. sql server 2005 T-SQL BEGIN TRANSACTION (Transact-SQL)
  3. 自带数据线的迷你数显充电宝,旅途必备
  4. 爬取王垠的博客并生成pdf
  5. iconv 文件编码转换
  6. ubuntu16.04安装torch
  7. C++简单排序,堆排序
  8. PhotoSwipe 图片浏览插件使用方法
  9. Linux进程编程(PS: exec族函数、system、popen函数)
  10. 给窗口设置系统级或窗口级的热键
  11. 使用 Core Graphics 绘制基本形状
  12. git-stash简单用法
  13. Phinx - 数据库迁移及版本控制介绍(内含中文文档翻译)
  14. 三种方法在地图上绘制网络图
  15. Excel文件导入mysql数据库
  16. 编写 Window 服务程序
  17. pythonqueue线程_python基于queue和threading实现多线程下载实例
  18. 工作中关于 使用YUICompressor进行JS压缩 的问题小节
  19. IDEA的xml注释的顶格和空格问题
  20. matlab人脸识别论文

热门文章

  1. 关于有朋友询问,Spartacus,Fiori,SAP UI5这些术语的关系
  2. scratch desktop的基本使用 - 舞台坐标系
  3. SAP ABAP和Java里的弱引用(WeakReference)和软引用(SoftReference)
  4. 如何关闭SAP CRM中间件的delta download方式
  5. 在SAP云平台的API portal里创建和管理API
  6. Android studio如何连接三星手机
  7. Fiori应用的花瓣动画效果是怎么画出来的
  8. SAP CRM and C4C PDF print
  9. object overview page打开后白屏问题分析
  10. 推荐一个非常好用的以多tab标签方式打开windows CMD的工具