Java - streams的嵌套循环优化导致不同的结果



我尝试在Java中并行运行13个for循环,我尝试用DoubleStream重写它们。问题是相同代码提供的输出,但是带有"for"Loops与streams提供的选项不同。

另一个问题是"for"循环的实现需要很多时间,我需要改进它。我认为流方法是不正确的,因为我所做的操作是串行的,线程的顺序是随机的,所以处理不是很正确。有什么方法可以获得相同的结果或者并行化for循环吗?我的代码如下:

DoubleStream.iterate(0, x -> x + 0.2).limit(5).parallel().forEach(a -> {
System.out.println("Iteration " + a + " min var " + wrapperMinVariation.minVariation + "values: " + wrapperMinA.minA + " " + wrapperMinB.minB);
DoubleStream.iterate(0, x -> x + 0.2).limit(5).parallel().forEach(b -> {
System.out.println("Iteration " + a +" "+ b +" min var " + wrapperMinVariation.minVariation + "values: " + wrapperMinA.minA + " " + wrapperMinB.minB);
DoubleStream.iterate(0, x -> x + 0.2).limit(5).parallel().forEach(c -> {
DoubleStream.iterate(0, x -> x + 0.2).limit(5).parallel().forEach(d -> {
DoubleStream.iterate(0, x -> x + 0.2).limit(5).parallel().forEach(e -> {
DoubleStream.iterate(0, x -> x + 0.2).limit(5).parallel().forEach(f -> {
DoubleStream.iterate(0, x -> x + 0.2).limit(5).parallel().forEach(g -> {
DoubleStream.iterate(0, x -> x + 0.2).limit(5).parallel().forEach(h -> {
DoubleStream.iterate(0, x -> x + 0.2).limit(5).parallel().forEach(m -> {
DoubleStream.iterate(0, x -> x + 0.2).limit(5).parallel().forEach(n -> {
DoubleStream.iterate(0, x -> x + 0.2).limit(5).parallel().forEach(o -> {
DoubleStream.iterate(0, x -> x + 0.2).limit(5).parallel().forEach(p -> {
double variation = 0;
for (int i = 0; i < wrapper.list.size(); i++) {

// operations with a,b,c,d,e,f,g,h,m,n,o,p
variation += variationPerMatch;
}
double finalVariationMatches = variation / wrapper.list.size();
if (finalVariationMatches < wrapperMinVariation.minVariation) {
wrapperMinA.minA = a;
wrapperMinB.minB = b;
wrapperMinC.minC = c;
wrapperMinD.minD = d;
wrapperMinE.minE = e;
wrapperMinF.minF = f;
wrapperMinG.minG = g;
wrapperMinH.minH = h;
wrapperMinM.minM = m;
wrapperMinN.minN = n;
wrapperMinO.minO = o;
wrapperMinP.minP = p;
wrapperMinVariation.minVariation = finalVariationMatches;
}
});
});
});
});
});
});
});
});
});
});
});
});

问题是相同代码提供的输出,但是带有"for"Loops与streams提供的选项不同。

由于问题中的代码是不完整的,因此不可能知道为什么并行处理它会给出不同的答案。一种可能性是,这是浮点舍入误差的结果。如果计算以不同的顺序进行,则可能导致结果的四舍五入不同。

我认为流方法是不正确的,因为我所做的操作是串行的,线程的顺序是随机的,所以处理不是很正确。

这是合理的;看到上面。


是否有任何方法可以获得相同的结果或并行for循环?

既然我们不能理解代码应该做什么,我认为我们不能提出替代方案。(最好的答案可能是一种完全不同的算法方法……这并不涉及512单独的计算。)

然而,我要注意,在每个级别添加parallel()可能会使代码变慢而不是变快。并行运行任务会带来开销。如果任务太小(即太细粒度),创建和管理任务的开销可能会淹没并行化可能实现的节省。

除非您的JVM可以访问大量的物理内核,否则将计算分解为512可能并行的任务/步骤是一个坏主意。