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