私は並列プログラミングが初めてで、QuickSortParallel
メソッドが私の順次バージョン (Parallel.Invoke なし) よりも遅い理由がわかりません。ソートするために渡す 10 万個の 9 桁の数字で構成されるギザギザの配列があります。残念ながら、このQuickSortParallel
方法を使用すると、シーケンシャル バージョンよりも約 5 倍遅くなります。
データ ソースで Parallel.Invoke を使用する以上のことはできますか?
public static void QuickSort_Parallel<T>(T[] array2) where T : IComparable<T>
{
QuickSortParallel(array2, 0, array2.Length - 1);
}
private static void QuickSortParallel<T>(T[] array2, int left, int right)
where T : IComparable<T>
{
if (left >= right)
{
return;
}
SwapElements(array2, left, (left + right) / 2); //median pivot
int last = left;
for (int current = left + 1; current <= right; ++current)
{
//CompareTo, compares current array index value with
if (array2[current].CompareTo(array2[left]) < 0)
{
++last;
SwapElements(array2, last, current);
}
}
SwapElements(array2, left, last);
//Recursive
//Executes each of the provided actions in parallel.
Parallel.Invoke(
() => QuickSortParallel(array2, left, last - 1),
() => QuickSortParallel(array2, last + 1, right)
);
}
static void SwapElements<T>(T[] array2, int i, int j)
{
T temp = array2[i];
array2[i] = array2[j];
array2[j] = temp;
}