【发布时间】:2017-03-30 22:48:18
【问题描述】:
我有以下代码(只是我为这个问题写的一个例子),它只是计算一个范围的总和 我通过三种方式实现它:
- 序列号
- 并行流
- 使用 ForkJoinPool
令人惊讶的是,串行方法是最快的方法。事实上,它花费了其他两个时间的 %10。
为了使其更快,Java Stream 的正确配置是什么? 我做错了什么?
package ned.main;
import java.util.Date;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.stream.IntStream;
public class TestParallelStream {
static private void testParallelStream() {
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "1000000");
ForkJoinPool forkJoinPool = new ForkJoinPool(10000);
Date start = new Date();
long sum1 = 0;
for (int i = 0; i < 1_000_000; ++i) {
sum1 += i * 10;
}
Date start1 = new Date();
long sum2 = IntStream.range(1, 1_000_000)
.parallel()
.map(x -> x * 10)
.sum();
Date start2 = new Date();
try {
long sum3 = forkJoinPool.submit(() ->
IntStream
.range(1, 1_000_000)
.parallel()
.map(x -> x * 10)
.sum())
.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
long serial = start1.getTime() - start.getTime();
long parallelstream = start2.getTime() - start1.getTime();
long withfork = start2.getTime() - start1.getTime();
System.out.println(serial + "," + parallelstream + "," + withfork);
}
public static void main(String[] args) {
testParallelStream();
}
}
谢谢
【问题讨论】:
-
jvm 设置流/线程所需的时间比累积乘法要长得多。尝试使用更多的复杂性,数字会改变
-
感谢 cmets。我同意给出的示例程序可能是您提到的情况。但是如何正确配置并行方法以及如何确保获得最佳性能?在我的实际应用中,我有数千个向量,我需要找到最接近给定向量的向量。这更复杂,但仍然表明帽子序列更快
标签: java parallel-processing java-stream