29

ここに記載されているJava 8機能を使用していました。何が正確に何をするのか理解できませんでした。との実際の違いは何か説明できますか?parallelSort()sort()parallelSort()

4

7 に答える 7

52

並列ソートはスレッド化を使用します。各スレッドはリストのチャンクを取得し、すべてのチャンクが並列にソートされます。次に、これらのソートされたチャンクが結果にマージされます。

コレクションに多くの要素がある場合は高速です。並列化 (チャンクへの分割とマージ) のオーバーヘッドは、大きなコレクションでは許容できるほど小さくなりますが、小さなコレクションでは大きくなります。

次の表を見てください (もちろん、結果は CPU、コア数、バックグラウンド プロセスなどによって異なります)。

ここに画像の説明を入力

このリンクから取得: http://www.javacodegeeks.com/2013/04/arrays-sort-versus-arrays-parallelsort.html

于 2013-06-26T18:49:34.427 に答える
15

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;
}

配列を並列にソートするかシリアルにソートするかを決定したら、次に、配列を複数の部分に分割する方法を決定し、各部分をフォーク/結合タスクに割り当ててソートを処理し、次に別のフォーク/ソートされた配列のマージを処理する Join タスク。JDK 8 での実装では、次のアプローチを使用します。

  • 配列を 4 つの部分に分割します。

  • 最初の 2 つの部分を並べ替えてから、それらをマージします。

  • 次の 2 つの部分を並べ替えてから、それらをマージします。上記のステップは、ソートするパーツのサイズが上記で計算されたしきい値より小さくなくなるまで、各パーツで再帰的に繰り返されます。

Javadocで実装の詳細を読むこともできます

ソート アルゴリズムは、配列をサブ配列に分割し、それ自体をソートしてからマージする並列ソート/マージです。サブ配列の長さが最小粒度に達すると、サブ配列は適切な Arrays.sort メソッドを使用してソートされます。指定された配列の長さが最小粒度よりも小さい場合、適切な Arrays.sort メソッドを使用して並べ替えられます。このアルゴリズムには、元の配列の指定された範囲のサイズ以下の作業領域が必要です。ForkJoin 共通プールは、並列タスクを実行するために使用されます。

配列.並べ替え():

これは、マージソートまたはその下のティムソートを使用してコンテンツをソートします。マージソートは分割統治法を使用しますが、これはすべて順次に行われますが、すべて順次に行われます。

ソース

于 2013-06-26T18:48:57.250 に答える
5

両方のアルゴリズムの主な違いは次のとおりです。

1. Arrays.sort() : 順次ソートです。

  • API は操作にシングル スレッドを使用します。
  • API は操作を実行するのに少し時間がかかります。

2. Arrays.ParallelSort() : 並列ソートです。

API は複数のスレッドを使用します。

  • API は、Sort() に比べて時間がかかりません。

より多くの結果を得るには、JAVA 8 を待つ必要があると思います!! 乾杯 !!

于 2013-06-26T18:57:42.807 に答える
3

配列が十分に大きい場合、アルゴリズムが複数のスレッドを使用することを説明するjavadocを参照できます。

ソート アルゴリズムは、配列をサブ配列に分割し、それ自体をソートしてからマージする並列ソート/マージです。サブ配列の長さが最小粒度に達すると、サブ配列は適切なArrays.sort方法を使用してソートされます。[...]共通プールはForkJoin並列タスクを実行するために使用されます。

于 2013-06-26T18:51:20.770 に答える
2

一言で言えば、parallelSort複数のスレッドを使用します。本当に知りたい場合は、この記事にもっと詳しい情報があります。

于 2013-06-26T18:49:43.990 に答える
2

このリンクから

Java コレクション フレームワーク (Collections.sort および Arrays.sort) によって提供される現在の並べ替えの実装はすべて、呼び出しスレッドで並べ替え操作を順番に実行します。この機能強化により、Arrays クラスによって現在提供されているのと同じ一連の並べ替え操作が提供されますが、Fork/Join フレームワークを利用する並列実装が提供されます。これらの新しい API は、並列並べ替えが完了するまで並べ替え操作を進めないため、呼び出しスレッドに関してはまだ同期的です。

于 2013-06-26T18:50:48.557 に答える