我正在嘗試確定停止細(xì)分我的 Mergesort 實現(xiàn)的合理閾值。但是,我得到的結(jié)果是閾值應(yīng)該在 10 7 < x < 10 8之間,這是荒謬的,因為 java 使用的默認(rèn)閾值約為 8192。它基本上告訴我細(xì)分幾乎總是不好的,更高的閾值更好,因為它執(zhí)行的拆分更少。它目前所做的工作是對一個大小為 10 8且隨機(jī)范圍為0to的浮點數(shù)數(shù)組進(jìn)行排序1000。對每個測試的閾值重復(fù)使用相同的隨機(jī)數(shù)組。public class ParallelMergeSort extends SortStrategy { @Override public long sort(float[] a, int cores, int threshold) { System.gc(); long start = System.nanoTime(); RecursiveAction mainTask = new SortTask(a, 0, a.length - 1); SortTask.threshold = threshold; ForkJoinPool pool = new ForkJoinPool(cores); pool.invoke(mainTask); return System.nanoTime() - start; } private static class SortTask extends RecursiveAction { private float[] a; private int left, right; private static int threshold; SortTask(float[] a, int left, int right) { this.a = a; this.left = left; this.right = right; } @Override protected void compute() { if (left < right) { if ((right - left) < threshold) { Arrays.sort(a, left, right + 1); } else { int mid = (left + right)/2; invokeAll( new SortTask(a, left, mid), new SortTask(a, mid + 1, right) ); // Merge int n1 = mid - left + 1; int n2 = right - mid; float a1[] = new float[n1]; float a2[] = new float[n2]; // Fill sub arrays for (int i = 0; i < n1; ++i) a1[i] = a[left + i]; for (int j = 0; j < n2; ++j) a2[j] = a[mid + 1 + j]; } } } }}我知道由于 JIT,JVM 可能不可靠,但它應(yīng)該只影響前幾次迭代,不是嗎?尋找有關(guān)算法的建議或為什么我的結(jié)果與我的預(yù)期相差甚遠(yuǎn)。
Parallel Mergesort 基準(zhǔn)測試 - 確定找到的閾值
慕的地8271018
2022-11-02 10:31:22