Arrays.sort与Arrays.parallelSort
我們都使用Arrays.sort對對象和原始數組進行排序。 該API在下面使用合并排序或Tim排序對內容進行排序,如下所示:
即使合并排序使用分而治之技術,所有這些操作都是順序執行的。 Java 8來了,引入了一個新的API Arrays#parallelSort用于排序。 這是并行進行的排序。 有趣的權利! 讓我們看看它是如何做的...
Arrays#parallelSort使用Java 7中引入的Fork / Join框架將排序任務分配給線程池中可用的多個線程。 這被稱為吃自己的狗糧 。 Fork / Join實現了一種工作竊取算法,該算法在空閑線程中可以竊取在另一個線程中排隊的任務。
Arrays#parallelSort的概述:
該方法使用閾值,并且使用Arrays#sort()API對小于該閾值的任何大小的數組進行排序(即順序排序)。 并根據機器的并行性,數組大小計算閾值,并計算為:
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 /連接任務,將合并合并的數組。 JDK 8中的實現使用以下方法:
–將陣列分為4部分。
–排序前兩個部分,然后將它們合并。 –對接下來的兩個部分進行排序,然后將它們合并。 并且對每個零件遞歸地重復上述步驟,直到要分類的零件的尺寸不小于上面計算的閾值。
一些有趣的結果:
我試圖比較Arrays#sort和Arrays#parallelSort在具有4個CPU的計算機上花費的時間。 我用于此比較的程序是:
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);} } 每個API針對不同大小的雙精度值數組所花費的時間如下所示:
列表也有類似的實現,并且列表上的許多操作具有并行的等效項。
翻譯自: https://www.javacodegeeks.com/2013/04/arrays-sort-versus-arrays-parallelsort.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Arrays.sort与Arrays.parallelSort的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Byteman和JUnit进行故障注
- 下一篇: linux c 运行进程中输入命令行参数