web-dev-qa-db-ja.com

Arrays.sort()とArrays.parallelSort()の違い

ここ で述べた_Java 8_機能を実行していました。 parallelSort()が正確に行うことを理解できませんでした。誰かがsort()parallelSort()の実際の違いを説明できますか?

25
Gokul Nath KP

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

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

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

enter image description here

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

50
darijan

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つの部分に分割します。

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

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

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

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

Array.sort():

これは、マージソートOR下のTim Sortを使用してコンテンツをソートします。マージソートが分割統治手法を使用する場合でも、これはすべて順次実行されますが、すべて順次実行されます。

ソース

14
NINCOMPOOP

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

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

  • APIは、操作に単一スレッドを使用します。
  • APIが操作を実行するのに少し時間がかかります。

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

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

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

より多くの結果を得るには、Java 8を待つ必要があります。

4
PVR

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

並べ替えアルゴリズムは、並列の並べ替え-マージであり、配列をサブ配列に分割して、それ自体を並べ替えてからマージします。サブ配列の長さが最小単位に達すると、適切なArrays.sortメソッドを使用してサブ配列がソートされます。 [...]ForkJoin共通​​プールは、並列タスクを実行するために使用されます。

3
assylias

簡単に言えば、parallelSortは複数のスレッドを使用します。この 記事 は、本当に知りたい場合に、より詳細になります。

2
jh314

これから リンク

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

2
stinepike

Array.sort(myArray);

これで使用できます–

Arrays.parallelSort(myArray);

これにより、ターゲットコレクションが自動的にいくつかの部分に分割されます。これらは、いくつかのコアにわたって個別にソートされ、グループ化されます。ここでの唯一の注意点は、ビジーなWebコンテナーなどの高度にマルチスレッド化された環境で呼び出されると、CPUコンテキストスイッチの増加によるコストのため、このアプローチの利点が(90%以上)減少し始めることです。

ソース- リンク

1
Anshu Kumar