arrays.sort(._Arrays.sort与Arrays.parallelSort
arrays.sort(.
我們都使用Arrays.sort對對象和原始數(shù)組進行排序。 此API在下面使用合并排序或Tim排序?qū)?nèi)容進行排序,如下所示:
即使合并排序使用分而治之技術(shù),所有這些操作都是順序執(zhí)行的。 Java 8來了,引入了一個新的API Arrays#parallelSort用于排序。 這是并行進行的排序。 有趣的權(quán)利! 讓我們看看它如何...
Arrays#parallelSort使用Java 7中引入的Fork / Join框架將排序任務(wù)分配給線程池中可用的多個線程。 這被稱為吃自己的狗糧 。 Fork / Join實現(xiàn)了一種工作竊取算法,該算法在空閑線程中可以竊取在另一個線程中排隊的任務(wù)。
Arrays#parallelSort的概述:
該方法使用閾值,并且使用Arrays#sort()API對小于該閾值的任何大小的數(shù)組進行排序(即順序排序)。 閾值是根據(jù)機器的并行性,數(shù)組的大小來計算的,計算公式為:
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; } 一旦決定是對數(shù)組進行并行還是串行排序,現(xiàn)在就決定如何將數(shù)組分為多個部分,然后將每個部分分配給一個Fork / Join任務(wù),該任務(wù)將負責對它進行排序,然后再進行另一個Fork / Join任務(wù)將負責合并已排序的數(shù)組。 JDK 8中的實現(xiàn)使用以下方法:
–將陣列分為4部分。
–排序前兩個部分,然后將它們合并。 –對接下來的兩個部分進行排序,然后將它們合并。 并且對每個零件遞歸地重復(fù)上述步驟,直到要分類的零件的尺寸不小于上面計算的閾值。
一些有趣的結(jié)果:
我試圖比較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針對不同大小的雙精度值數(shù)組所花費的時間如下所示:
列表也有類似的實現(xiàn),并且列表上的許多操作具有并行的等效項。
翻譯自: https://www.javacodegeeks.com/2013/04/arrays-sort-versus-arrays-parallelsort.html
arrays.sort(.
總結(jié)
以上是生活随笔為你收集整理的arrays.sort(._Arrays.sort与Arrays.parallelSort的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 专家:苹果虚标5G有损中国5G声誉 要求
- 下一篇: glassfish 4配置_自己构建Gl