至尊宝的传说
stream()这与何时使用vs 的问题没有太大区别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 UnitsParallelSort.nonParallel 10 avgt 2 128.847 ns/opParallelSort.parallel 10 avgt 2 116.656 ns/opParallelSort.nonParallel 100 avgt 2 1956.746 ns/opParallelSort.parallel 100 avgt 2 1963.335 ns/opParallelSort.nonParallel 1000 avgt 2 32162.611 ns/opParallelSort.parallel 1000 avgt 2 31716.915 ns/opParallelSort.nonParallel 10000 avgt 2 423531.663 ns/opParallelSort.parallel 10000 avgt 2 201802.609 ns/opParallelSort.nonParallel 100000 avgt 2 6503511.987 ns/opParallelSort.parallel 100000 avgt 2 1363169.661 ns/opParallelSort.nonParallel 1000000 avgt 2 69058738.586 ns/opParallelSort.parallel 1000000 avgt 2 13469112.930 ns/op对我来说几乎是一个非常期待的输出。