Arrays.sort() VS Arrays.parallelSort()

英文原文地址:Arrays.sort vs Arrays.parallelSortjava

做者:baeldunggit

翻譯:高行行github

1. 概述

咱們都使用過 Arrays.sort() 對對象或原始數據類型數組(byteshortintlongcharfloatdoubleboolean)進行排序。在 JDK 8 中,創造者加強了 API 以提供一種新方法:Arrays.parallelSort()算法

在本教程中,咱們將對 sort() 和 parallelSort() 方法進行比較。數組

2. Arrays.sort()

Arrays.sort() 方法對對象或原始數據類型的數組進行排序。此方法中使用的排序算法是 Dual-Pivot Quicksort 換句話說,它是快速排序算法的自定義實現,以實現更好的性能。性能

此方法是單線程的 ,有兩種變體:測試

  • sort(array)–將整個數組按升序排序
  • sort(array, fromIndex, toIndex)–僅將從 fromIndex 到 toIndex 的元素排序

讓咱們看一下兩種變體的例子:ui

@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_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);
}

讓咱們總結一下這種方法的優缺點:線程

優勢 缺點
快速處理較小的數據集 大型數據集的性能降低
沒有利用系統的多個核心

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_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 算法。不然,它使用並行排序。

讓咱們總結一下使用它的優缺點:

優勢 缺點
爲大型數據集提供更好的性能 對於大小較小的數組,處理速度較慢
利用系統的多個核心

4.比較

如今,讓咱們看看在不一樣大小的數據集上兩種方法怎樣執行。如下數字是使用JMH 基準測試得出的。測試環境使用 AMD A10 PRO 2.1Ghz 四核處理器和 JDK 1.8.0_221:

數組大小 Arrays.sort() Arrays.parallelSort()
1000 o.048 0.054
10000 0.847 0.425
100000 7.570 4.395
1000000 65.301 37.998

5.結論

在這篇快速文章中,咱們看到了 sort() 和 parallelSort() 的不一樣之處。

根據性能結果,咱們能夠得出結論,當咱們要排序的數據集很大時,parallelSort() 多是更好的選擇。可是,在數組較小的狀況下,最好使用 sort(),由於它能夠提供更好的性能。

與往常同樣,完整的源代碼能夠在 GitHub 找到。

我的公衆號《駭客與畫家》,歡迎關注

相關文章
相關標籤/搜索