【发布时间】:2018-01-31 09:13:57
【问题描述】:
我正在努力提高性能至关重要的程序的速度。目前它无法处理大型数据集。有很多嵌套的 for 循环,所以我认为值得尝试并行流。我可以访问高性能集群,因此可能有许多可用内核。 我有以下方法:
public MinSpecSetFamily getMinDomSpecSets() {
MinSpecSetFamily result = new MinSpecSetFamily();
ResourceType minRT = this.getFirstEssentialResourceType();
if (minRT == null || minRT.noSpecies()) {
System.out.println("Problem in getMinDomSpecSets()");
}
for (Species spec : minRT.specList) {
SpecTree minTree = this.getMinimalConstSpecTreeRootedAt(spec);
ArrayList<SpecTreeNode> leafList = minTree.getLeaves();
for (SpecTreeNode leaf : leafList) {
ArrayList<Species> sp = leaf.getAncestors();
SpecSet tmpSet = new SpecSet(sp);
result.addSpecSet(tmpSet);
}
}
return result;
}
我知道我可以将嵌套的 for 循环转换为并行流,例如:
minRT.specList.parallelStream().flatMap(leaf -> leaflist.parallelStream())
但是,我找不到显示如何处理每个 for 循环中的操作的示例,而且我对它应该如何工作完全没有信心。我非常感谢有关如何转换此方法的一些帮助和解释,以便我也可以将解决方案转换为程序中的其他方法。 谢谢。
【问题讨论】:
-
您已经分析了软件,确定了热点,现在您对应该尝试优化的内容有了一个很好的想法?您将“将嵌套循环转换为并行流”基于实际数据,而不仅仅是猜测?
-
是的,我尝试过使用分析并确定此方法是占用最多 (99.7%) 处理时间的方法。我不认为这是由于方法不佳,而是纯粹的计算量。
标签: java parallel-processing java-8 java-stream