这与何时使用stream() 和parallelStream() 的问题没有太大区别——这取决于您拥有多少数据。当然,在并行排序 10 个元素时,大部分时间将被底层的线程框架(文档未指定)消耗,而不是由排序本身消耗。
但您也必须想知道为什么 IMO 会引入这种方法。硬件正在(已经移动?)向 许多 CPU 移动,而不是更多 GHz,因此对于任何希望在未来 20 年内仍然存在的语言来说,并行处理只是正常的过程.
至于您需要多少数据才能实际上在parallelSort 而不是sort 上表现出色,并且知道我们需要至少 MIN_ARRAY_SORT_GRAN + 1获得任何潜在利益;编写一个适当的测试来证明对于这个特定的设置和运行,您至少需要X 数字,这并不复杂。您还必须考虑到某些数组可能已经排序(进一步解释),而有些可能完全未排序(例如5,4,3,2,1),这会给第二个数组带来一些惩罚。
获取一些随机数据并进行测试:
@Warmup(iterations = 10)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Measurement(iterations = 2, time = 2, timeUnit = TimeUnit.SECONDS)
public class ParallelSort {
public static void main(String[] args) throws Exception {
Options opt = new OptionsBuilder()
.include(ParallelSort.class.getName())
.build();
new Runner(opt).run();
}
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@Fork(1)
public int[] parallel(ParallelSortExecutionPlan plan) {
Arrays.parallelSort(plan.ints());
return plan.ints();
}
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@Fork(1)
public int[] nonParallel(ParallelSortExecutionPlan plan) {
Arrays.sort(plan.ints());
return plan.ints();
}
}
@State(Scope.Benchmark)
public class ParallelSortExecutionPlan {
@Param(value = {"10", "100", "1000", "10000", "100000", "1000000"})
private int howMany;
private int[] ints;
public static void main(String[] args) {
}
@Setup(Level.Invocation)
public void setUp() {
ints = new int[howMany];
for (int i = 0; i < howMany; ++i) {
ints[i] = ThreadLocalRandom.current().nextInt();
}
}
int[] ints() {
return ints;
}
}
请注意第二类使用@Setup(Level.Invocation)(如果你知道一点JMH)——这是一个非常锋利的工具;但我使用它是因为我希望该方法的每个Invocation 都有一个未排序的数组。否则,如果 Trial 将被使用 - 只有第一个调用将是未排序的数组,@Benhcmark 方法的所有其他调用将已经排序。为了好玩,您可以将单行更改为 @Setup(Level.Trial) 例如并查看结果,它们会让非常意义不大。
运行它会显示:
Benchmark (howMany) Mode Cnt Score Error Units
ParallelSort.nonParallel 10 avgt 2 128.847 ns/op
ParallelSort.parallel 10 avgt 2 116.656 ns/op
ParallelSort.nonParallel 100 avgt 2 1956.746 ns/op
ParallelSort.parallel 100 avgt 2 1963.335 ns/op
ParallelSort.nonParallel 1000 avgt 2 32162.611 ns/op
ParallelSort.parallel 1000 avgt 2 31716.915 ns/op
ParallelSort.nonParallel 10000 avgt 2 423531.663 ns/op
ParallelSort.parallel 10000 avgt 2 201802.609 ns/op
ParallelSort.nonParallel 100000 avgt 2 6503511.987 ns/op
ParallelSort.parallel 100000 avgt 2 1363169.661 ns/op
ParallelSort.nonParallel 1000000 avgt 2 69058738.586 ns/op
ParallelSort.parallel 1000000 avgt 2 13469112.930 ns/op
对我来说,这是一个非常期待的输出。