【发布时间】:2015-01-23 04:47:03
【问题描述】:
作为对 Java 8 新的流和自动并行化实现的测试,我运行了以下简单测试:
ArrayList<Integer> nums = new ArrayList<>();
for (int i=1; i<49999999; i++) nums.add(i);
int sum=0;
double begin, end;
begin = System.nanoTime();
for (Integer i : nums) sum += i;
end = System.nanoTime();
System.out.println( "1 core: " + (end-begin) );
begin = System.nanoTime();
sum = nums.parallelStream().reduce(0, Integer::sum);
end = System.nanoTime();
System.out.println( "8 cores: " + (end-begin) );
我认为总结一系列整数将能够充分利用所有 8 个内核,但输出如下所示:
1 core: 1.70552398E8
8 cores: 9.938507635E9
我知道 nanoTime() 在多核系统中存在问题,但我怀疑这是这里的问题,因为我已经偏离了一个数量级。
我正在执行的操作是否如此简单,以至于 reduce() 所需的开销超过了多核的优势?
【问题讨论】:
-
我猜它与自动装箱有关...用 int 数组和计数器测试它?
-
请注意,
parallelSteam()并不总是使用您的所有内核。 -
什么自动装箱?一切都是整数。将
sum更改为整数也不会以任何方式影响性能。 -
另请注意,这不是正确的基准。使用微基准测试工具(如 jmh)真正检查性能差异。
-
撇开基准测试缺陷不谈,并行流的开销很可能会淹没多核的加速。有关这些问题的讨论,请参阅 When to use Parallel Streams。
标签: java optimization concurrency java-8