【发布时间】:2018-05-22 23:08:12
【问题描述】:
我正在对迭代集合的 Java aggeragate 操作进行一些性能评估。我正在评估stream 和parallelStream 的性能。但是我发现parallelStream 的输出大多数时候都是错误的。例如,在下面的代码中,我从parallelStream 得到错误输出的概率超过 80%:
public class ParallelStreamPerformance {
static int totaleven = 0;
public static void main(String[] args) {
List<Integer> randomList = new ArrayList<>();
Random rnd = new Random();
for(int i = 0 ;i < 1000;i++) {
int r = rnd.nextInt(500000);
randomList.add(r);
}
long s1 = System.currentTimeMillis();
randomList.stream().filter(e -> e%2 ==0).forEach(e -> count());
System.out.println("Even: "+totaleven);
long e1 = System.currentTimeMillis();
System.out.println(e1 - s1);
totaleven = 0;
long s2 = System.currentTimeMillis();
randomList.parallelStream().filter(e -> e%2 ==0).forEach(e -> count());
System.out.println("Even: "+totaleven);
long e2 = System.currentTimeMillis();
System.out.println(e2 - s2);
}
public static void count() {
totaleven++;
}
}
我的问题是:我是否以错误的方式使用parallelStream?有什么办法可以保证parallelStream的正确性。
谢谢
【问题讨论】:
-
您的基准测试方法比一文不值还要糟糕;它会给你答案,但他们会错的。见stackoverflow.com/questions/504103/…
-
谢谢@BrianGoetz
-
当你的实际问题是关于得到错误的结果时,你不应该用不相关的基准测试来混淆它。你的代码本可以缩短到十行,而关于你进行“性能评估”的散文也已经过时了。当您的代码无法正常运行时,您无需衡量其性能。
标签: java java-8 java-stream