当前位置: 首页 > news >正文

Java8 Arrays.sort VS Arrays.parallelSort应用实例源码教程

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Java8 Arrays.sort VS Arrays.parallelSort应用实例源码教程 博客分类: java

Java8 Arrays.sort VS Arrays.parallelSort应用实例源码教程。所有的开发者都会用到Arrays.sort来进行对象和原生数组进行排序,这个API会使用归并排序或者Tim排序来进行排序,源码如下所示:

1
2
3
4
5
6
public static void sort(Object[] a) {
   if (LegacyMergeSort.userRequested)
     legacyMergeSort(a);
   else
     ComparableTimSort.sort(a);
}

上面的代码会依次执行,技术归并排序使用了分治的技术。Java8出来之后,有一个新API用来进行排序,这就是 Arrays.ParallelSort,这是一种并行排序,有意思吧,让我们来看看它是怎么实现的。 Arrays.ParallelSort使用了Java7的Fork/Join框架使得排序任务可以在现场池中的多个线程中进行,Fork/Join实现 了一种任务窃取算法,一个闲置的线程可以窃取其他线程的闲置任务进行处理。

Arrays.parallelSort概述

这个方法使用了一个临界值,还有一些容量小于这个临界值的数组,这个临界值和数组的容量都是计算来用于并行计算的,如下代码所示:

1
2
3
4
5
private static final int getSplitThreshold( int n) {
   int p = ForkJoinPool.getCommonPoolParallelism();
   int t = (p > 1 ) ? ( 1 + n / (p << 3 )) : n;
   return t < MIN_ARRAY_SORT_GRAN ? MIN_ARRAY_SORT_GRAN : t;
}

一旦数组决定了使用并行排序,那他马上会被分为几个部分,然后通知Fork/Join任务对各个部分进行排序,跟着通知另外的Fork/Join任 务对排序后的数组进行合并。Java8使用如下的方法进行实现: 1、将数组分成4个子数组。 2、对前面两个子数组进行排序然后合并。 3、对后面的两个进行排序然后合并。 上面着几个步骤会重复递归,每个子数组都要求容量小于上面计算出来的临界值。

一些有意思的结果

我尝试去对比Arrays.sort和Arrays.parallelSort的排序时间,在一台4CPU的电脑上,使用如下的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class ArraysParallelDemo {
   public static void main(String[] args) throws FileNotFoundException {
     List<Double> arraySource = new ArrayList<>();
     Scanner reader = new Scanner(ClassLoader.
         getSystemResourceAsStream( "java8demo/large_array_input" ));
     while (reader.hasNext()){
       String line = reader.nextLine();
       String[] strNums = line.split( "," );
       for ( String strN : strNums){
           arraySource.add(Double.parseDouble(strN));
       }
     }
     System.out.println(arraySource.size());
     Double [] myArray = new Double[ 1 ];
     myArray = arraySource.toArray(myArray);
     long startTime = System.currentTimeMillis();
     Arrays.sort(myArray);
     long endTime = System.currentTimeMillis();
     System.out.println( "Time take in serial: " +
         (endTime-startTime)/ 1000.0 );
     Double [] myArray2 = new Double[ 1 ];
     myArray2 = arraySource.toArray(myArray);
     startTime = System.currentTimeMillis();
     Arrays.parallelSort(myArray2);
     endTime = System.currentTimeMillis();
     System.out.println( "Time take in parallel: " +
         (endTime-startTime)/ 1000.0 );
   }
}

数组容量和时间消耗的一个基准测试如下所示:


在数组容量小于10000的情况下,并行排序和串行排序消耗时间是差不多的,但是当数组容量在10000以上的时候,并行排序就体现出了它的优势。

本文链接地址: Java8 Arrays.sort VS Arrays.parallelSort应用实例源码教程

转载于:https://my.oschina.net/xiaominmin/blog/1599424

相关文章:

  • Facebook iOS 新版开发手记:两倍速度的背后(转)(参考)
  • Azure ARM创建和部署自定义操作系统映像
  • 维基百科新增电子书导出功能,方便离线阅读
  • CentOS6.9安装LAMP(Centos6.9+Apache2.2.15+mysql5.1.73+php5.3.3)
  • MFC禁止改变窗口大小和移动窗口
  • 人月神话6
  • Windows下编译项目 ckcore ckfilesystem
  • HTML5、canvas、SVG
  • Thirft框架介绍
  • Android鬼点子-通过Google官方示例学NDK(2)
  • Java泛型-类型擦除
  • 【Dalston】【第五章】API服务网关(Zuul) 上
  • Cocos2d中从场景切换到UIViewController视图方法总结
  • OpenStack架构详解
  • mysql安装出现error Nr.1045
  • 时间复杂度分析经典问题——最大子序列和
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Android系统模拟器绘制实现概述
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • overflow: hidden IE7无效
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • yii2权限控制rbac之rule详细讲解
  • Zepto.js源码学习之二
  • 对JS继承的一点思考
  • 小程序测试方案初探
  • 一、python与pycharm的安装
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 原生Ajax
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #Linux(Source Insight安装及工程建立)
  • (补)B+树一些思想
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (论文阅读11/100)Fast R-CNN
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .gitignore文件设置了忽略但不生效
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .net访问oracle数据库性能问题
  • .pyc文件是什么?
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @Bean, @Component, @Configuration简析
  • [] 与 [[]], -gt 与 > 的比较
  • [20180224]expdp query 写法问题.txt
  • [AIGC] MySQL存储引擎详解
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [AIGC] Spring Interceptor 拦截器详解
  • [C++]类和对象(中)
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽
  • [c语言]小课堂 day2