下面是一个使用并行归并排序进行基准测试的示例代码:
import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
public class ParallelMergeSortBenchmark {
// 并行归并排序的阈值
private static final int THRESHOLD = 1000;
public static void main(String[] args) {
// 创建一个随机数组
int[] arr = generateRandomArray(1000000);
// 串行归并排序
int[] serialResult = serialMergeSort(arr.clone());
// 并行归并排序
int[] parallelResult = parallelMergeSort(arr.clone());
// 验证结果是否正确
System.out.println("结果是否正确:" + Arrays.equals(serialResult, parallelResult));
}
// 串行归并排序
public static int[] serialMergeSort(int[] arr) {
if (arr.length <= 1) {
return arr;
}
int mid = arr.length / 2;
int[] left = Arrays.copyOfRange(arr, 0, mid);
int[] right = Arrays.copyOfRange(arr, mid, arr.length);
left = serialMergeSort(left);
right = serialMergeSort(right);
return merge(left, right);
}
// 并行归并排序
public static int[] parallelMergeSort(int[] arr) {
ForkJoinPool pool = new ForkJoinPool();
MergeSortTask task = new MergeSortTask(arr);
pool.invoke(task);
return task.getResult();
}
// 归并操作
public static int[] merge(int[] left, int[] right) {
int[] merged = new int[left.length + right.length];
int leftPtr = 0, rightPtr = 0, mergedPtr = 0;
while (leftPtr < left.length && rightPtr < right.length) {
if (left[leftPtr] <= right[rightPtr]) {
merged[mergedPtr++] = left[leftPtr++];
} else {
merged[mergedPtr++] = right[rightPtr++];
}
}
while (leftPtr < left.length) {
merged[mergedPtr++] = left[leftPtr++];
}
while (rightPtr < right.length) {
merged[mergedPtr++] = right[rightPtr++];
}
return merged;
}
// 生成随机数组
public static int[] generateRandomArray(int size) {
int[] arr = new int[size];
Random random = new Random();
for (int i = 0; i < size; i++) {
arr[i] = random.nextInt(1000);
}
return arr;
}
// 并行归并排序任务
static class MergeSortTask extends RecursiveAction {
private final int[] arr;
private int[] result;
public MergeSortTask(int[] arr) {
this.arr = arr;
}
public int[] getResult() {
return result;
}
@Override
protected void compute() {
if (arr.length <= THRESHOLD) {
result = serialMergeSort(arr);
return;
}
int mid = arr.length / 2;
int[] left = Arrays.copyOfRange(arr, 0, mid);
int[] right = Arrays.copyOfRange(arr, mid, arr.length);
MergeSortTask leftTask = new MergeSortTask(left);
MergeSortTask rightTask = new MergeSortTask(right);
invokeAll(leftTask, rightTask);
result = merge(leftTask.getResult(), rightTask.getResult());
}
}
}
这个示例中,首先生成一个随机数组,并使用串行归并排序和并行归并排序对数组进行排序。然后,验证两种排序方法得到的结果是否相同。