考虑50,000个对象的集合。 每个对象通过其doWork()方法每次迭代产生10个双精度。
有一个连续的while循环遍历每个50,000个对象和 调用doWork()。 在此之后,必须通过在每个双打上调用process()来处理所创建的10个双打中的每一个。
while循环中的最后一步必须对每次迭代中产生的双精度求和,然后记录输出。
设计是否取决于完成doWork()和process()所需的相对时间?
实现此算法的最快且最有效的CPU方法是什么?
我想使用多核可以帮助很多......
我应该使用ExecutorService还是ForkJoin?
我应该如何分割任务?
List<A> listA = new ArrayList<>();
populateWith50k(listA); // has 50k objects after this line
List<Double> listB = new ArrayList<>();
while(true){
// causes a side affect, hence a change of state that the remaining code
// depends on, hence I don't think we can use java streams...
changeState();
// the below depends on the system state setup above
for (int i=0;i<listA.size();i++){
A a = listA.get(i);
a.doWork();
populateUsingA(a); // populates listB, each A creates 10 doubles
for (int j=0;j<listB.size();j++){
B b = listB.get(j);
b.process();
}
sumAndThenLogValuesInListB(a);
listB.clear();
}
}
答案 0 :(得分:2)
您应该使用并行流。
listA.parallelStream().flatMapToDouble(A::doWork).sum()
将为您提供一次通过while循环的总和。您需要更改doWork
以立即输出十个双打,或者引入另一个执行此操作的方法,或者编写更复杂的lambda身体(为了便于阅读,我不建议这样做) )。