bucket sort sample sort 并行_Java 中 Arrays.sort 和 Arrays.parallelSort 哪个更快?

92b3a667993026f6765a31a262a7441c.png

1. 概述

我们都使用过 Arrays.sort() 对对象或原始数据类型数组(byte,short,int,long,char,float,double和boolean)进行排序。在 JDK 8 中,创造者增强了 API 以提供一种新方法:Arrays.parallelSort()。

在本教程中,我们将对 sort() 和 parallelSort() 方法进行比较。

2. Arrays.sort()

Arrays.sort() 方法对对象或原始数据类型的数组进行排序。此方法中使用的排序算法是 Dual-Pivot Quicksort[3]。 换句话说,它是快速排序算法的自定义实现,以实现更好的性能。

此方法是单线程的 ,有两种变体:

  • sort(array)–将整个数组按升序排序
  • sort(array, fromIndex, toIndex)–仅将从 fromIndex 到 toIndex 的元素排序

让我们看一下两种变体的例子:

@Testpublic void givenArrayOfIntegers_whenUsingArraysSortMethod_thenSortFullArrayInAscendingOrder() {    int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };    int[] expected = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };    Arrays.sort(array);    assertArrayEquals(expected, array);}@Testpublic void givenArrayOfIntegers_whenUsingArraysSortMethodWithRange_thenSortRangeOfArrayInAscendingOrder() {    int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };    int[] expected = { 10, 4, 1, 2, 6, 7, 8, 9, 3, 5 };    Arrays.sort(array, 2, 8);    assertArrayEquals(expected, array);}

让我们总结一下这种方法的优缺点:

8bf71932223358b02961842000f78d2c.png

3. Arrays.parallelSort()

此方法对对象或原始数据类型的数组进行排序。与 sort() 类似,它也有两个变体来对完整数组和部分数组进行排序:

@Testpublic void givenArrayOfIntegers_whenUsingArraysParallelSortMethod_thenSortFullArrayInAscendingOrder() {    int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };    int[] expected = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };    Arrays.parallelSort(array);    assertArrayEquals(expected, array);}@Testpublic void givenArrayOfIntegers_whenUsingArraysParallelSortMethodWithRange_thenSortRangeOfArrayInAscendingOrder() {    int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };    int[] expected = { 10, 4, 1, 2, 6, 7, 8, 9, 3, 5 };    Arrays.parallelSort(array, 2, 8);    assertArrayEquals(expected, array);}

parallelSort() 在功能上有所不同。与 sort() 使用单个线程对数据进行顺序排序不同,它使用并行排序-合并排序算法。它将数组分成子数组,这些子数组本身先进行排序然后合并。

为了执行并行任务,它使用 ForkJoin 池。

但是我们需要知道,只有在满足某些条件时,它才会使用并行性。如果数组大小小于或等于 8192,或者处理器只有一个核心,则它将使用顺序的 Dual-Pivot Quicksort 算法。否则,它使用并行排序。

让我们总结一下使用它的优缺点:

4d407affac902e0bbdc1f955c9a12a01.png

优缺点

4.比较

现在,让我们看看在不同大小的数据集上两种方法怎样执行。以下数字是使用JMH 基准测试[4]得出的。测试环境使用 AMD A10 PRO 2.1Ghz 四核处理器和 JDK 1.8.0_221:

0376cab140724344c422f96841a334c8.png

5.结论

在这篇短篇文章中,我们看到了 sort() 和 parallelSort() 的不同之处。

根据性能结果,我们可以得出结论,当我们要排序的数据集很大时,parallelSort() 可能是更好的选择。但是,在数组较小的情况下,最好使用 sort(),因为它可以提供更好的性能。

与往常一样,完整的源代码可以在 GitHub[5] 找到。

参考资料

[1] Arrays.sort vs Arrays.parallelSort: https://www.baeldung.com/java-arrays-sort-vs-parallelsort

[2] baeldung: https://www.baeldung.com/author/baeldung/

[3] Quicksort: https://www.baeldung.com/algorithm-quicksort

[4] JMH基准测试: https://www.baeldung.com/java-microbenchmark-harness

[5] GitHub: https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-arrays-2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值