1. 概述
我们都使用过Arrays.sort()来对对象或原始类型数组进行排序。在JDK 8中,创建者增强了API以提供一种新方法:Arrays.parallelSort()。
在本教程中,我们将比较sort()和parallelSort()方法。
2. Arrays.sort()
Arrays.sort()方法对对象或原始类型数组进行排序。该方法中使用的排序算法是双轴快速排序。换句话说,它是快速排序算法的自定义实现,以实现更好的性能。
此方法是单线程的,有两种变体:
- sort(array):将整个数组按升序排序
- sort(array, fromIndex, toIndex):仅对从fromIndex到toIndex的元素进行排序
让我们看一下这两种变体的示例:
@Test
public 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);
}
@Test
public void givenArrayOfIntegers_whenUsingArraysSortWithRange_thenSortRangeOfArrayAsc() {
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);
}
让我们总结一下这种方法的优缺点:
优点 | 缺点 |
---|---|
在较小的数据集上更快 | 大型数据集的性能下降 |
未利用系统的多个核心 |
3. Arrays.parallelSort()方法
此方法也对对象或原始类型数组进行排序。与sort()类似,它也有两个变体来对完整数组和部分数组进行排序:
@Test
public 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);
}
@Test
public void givenArrayOfIntegers_whenUsingArraysParallelSortWithRange_thenSortRangeOfArrayAsc() {
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或处理器只有一个核心,则它使用顺序双轴快速排序算法。否则,它使用并行排序。
让我们总结一下使用它的优缺点:
优点 | 缺点 |
---|---|
为大型数据集提供更好的性能 | 较小大小的数组较慢 |
利用系统的多个核心 |
4. 比较
现在让我们看看这两种方法在不同大小的数据集上的表现。以下数字是使用JMH基准测试得出的,测试环境使用AMD A10 PRO 2.1Ghz四核处理器和JDK 17.0.5:
数组大小 | Arrays.sort() | Arrays.parallelSort() |
---|---|---|
1000 | 0.048 | 0.054 |
10000 | 0.847 | 0.425 |
100000 | 7.570 | 4.395 |
1000000 | 65.301 | 37.998 |
5. 总结
在这篇简短的文章中,我们了解了sort()和parallelSort()的不同之处。
根据性能结果,我们可以得出总结,当我们要对大型数据集进行排序时,parallelSort()可能是更好的选择。但是,对于较小的数组,最好使用sort(),因为它提供更好的性能。
与往常一样,本教程的完整源代码可在GitHub上获得。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章