2

リリースをダウンロードjava8-eaし、 と をすばやく比較Array.sortしましたArrays.parallelSort

そして、これが結果でした: ここに画像の説明を入力

praralleSort は、少なくとも Plain oldsortと同じくらい速く動作するはずだと理解できます..しかし、これは起こったことではありません。

次の仕様で行われた比較:

Intel Core i5バージョンの JDK を搭載し4G RAMたHP ProBook Ubuntu 13.04 Linux:Java HotSpot(TM) 64-Bit Server VM (build 25.0-b23, mixed mode)

この方法で 3 つのフィールドのカスタム オブジェクトの配列を作成しました (予約順にオブジェクトを追加します)。

package com.cmd;

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {

        for (int i=100; i <= 10_000_000; i*=10){
            runTest(i);
        }
    }

    private static void runTest(final int size){

        // Fist obtain two Arrays of same data
        Employee[] empArrForSort = createVeryLargeEmpArray(size);
        Employee[] empArrForSortCopy = Arrays.copyOf(empArrForSort, empArrForSort.length);

        long start = System.currentTimeMillis();
        Arrays.sort(empArrForSort, (e1, e2) -> new Integer(e1.getId()).compareTo(e2.getId()));
        logStart(size + ": sort", start);

        start = System.currentTimeMillis();
        Arrays.parallelSort(empArrForSortCopy, (e1, e2) -> new Integer(e1.getId()).compareTo(e2.getId()));
        logStart(size + ": parallel sort", start);
    }


    private static void logStart(String label, long startTimeMillis) {
        System.out.println("End " + label + " the array. It took: " + (System.currentTimeMillis() - startTimeMillis) + " ms");
    }

    private static Employee[] createVeryLargeEmpArray(final int size) {

        Employee[] ret = new Employee[size];

        for (int i = 0; i < ret.length; i++) {
            ret[i] = Employee.createEmployee(ret.length - i, "Mohammad" + i, "");
        }

        return ret;
    }

    static class Employee {

        private int id;
        private String name;
        private String email;

        private Employee(int id, String name, String email) {
            this.id = id;
            this.name = name;
            this.email = email;
        }

        public static Employee createEmployee(int id, String name, String email) {
            return new Employee(id, name, email);
        }

        public int getId() {
            return id;
        }
    }

}

また、別の実行では、Parallel はリストに 10,000,000 が含まれている場合にのみパッドを実行し、それ以外の場合はすべて見栄えが良いことを示しています。

>java -Xmx2000m com.cmd.Main
End 100: sort the array. It took: 110 ms
End 100: parallel sort the array. It took: 6 ms
End 1000: sort the array. It took: 2 ms
End 1000: parallel sort the array. It took: 3 ms
End 10000: sort the array. It took: 11 ms
End 10000: parallel sort the array. It took: 11 ms
End 100000: sort the array. It took: 15 ms
End 100000: parallel sort the array. It took: 37 ms
End 1000000: sort the array. It took: 553 ms
End 1000000: parallel sort the array. It took: 187 ms
End 10000000: sort the array. It took: 640 ms
End 10000000: parallel sort the array. It took: 1099 ms
4

3 に答える 3

9

ここでのポイントは、配列が逆順にソートされていることです。これは、アルゴリズムの一般的なパフォーマンスについて何も意味しない、非常にユニークなシナリオです。同じコードを実行しましたが、順序付けされていない配列を使用しました。

  ret[i] = Employee.createEmployee(rnd.nextInt(ret.length), "Mohammad" + i, "");

結果は、逆順と比較してパフォーマンスがはるかに遅いことを示していますが、parallelSort は単純な並べ替えよりもはるかに高速です。

End 100: sort the array. It took: 139 ms
End 100: parallel sort the array. It took: 4 ms
End 1000: sort the array. It took: 4 ms
End 1000: parallel sort the array. It took: 6 ms
End 10000: sort the array. It took: 35 ms
End 10000: parallel sort the array. It took: 30 ms
End 100000: sort the array. It took: 420 ms
End 100000: parallel sort the array. It took: 144 ms
End 1000000: sort the array. It took: 1341 ms
End 1000000: parallel sort the array. It took: 506 ms
End 10000000: sort the array. It took: 12200 ms
End 10000000: parallel sort the array. It took: 3971 ms
于 2013-09-09T13:29:42.053 に答える
1

createVeryLargeEmpArray以下のように、メソッド内の 2 行だけを変更しました。

Random random = new Random();
ret[i] = Employee.createEmployee(ret.length - i+random.nextInt(size), "Mohammad" + i, "");

結果はこちら

End 100: 配列をソートします。かかった時間: 27 ミリ秒
終了 100: 配列の並列ソート。かかった時間: 1 ミリ秒

End 1000: 配列をソートします。かかった時間: 1 ミリ秒
終了 1000: 配列の並列ソート。かかった時間: 1 ミリ秒

End 10000: 配列をソートします。かかった時間: 7 ミリ秒
終了 10000: 配列の並列ソート。かかった時間: 145 ミリ秒

End 100000: 配列をソートします。かかった時間: 105 ミリ秒
終了 100000: 配列の並列ソート。かかった時間: 59 ミリ秒

End 1000000: 配列をソートします。かかった時間: 1050 ミリ秒
終了 1000000: 配列の並列ソート。かかった時間: 194 ミリ秒

End 10000000: 配列をソートします。かかった時間: 12636 ミリ秒
終了 10000000: 配列の並列ソート。かかった時間: 2107 ミリ秒

並べ替えられていない要素の数が増えると、並列並べ替えは通常の並べ替えよりもはるかに優れたパフォーマンスを発揮し始めます。

于 2015-07-03T13:42:52.323 に答える
-1

私は多数のテストを作成しましたが、ほとんどの場合、parallelSort は (シリアル) ソートよりもはるかに優れたパフォーマンスを発揮します。

于 2014-06-24T23:27:45.027 に答える