我有2个列表,并希望逐个元素添加它们。像那样:
是否有一种更简单的方法,可能比使用well performing way
迭代第一个列表并将其添加到结果列表更多for loop
?
感谢您的回答!
答案 0 :(得分:3)
取决于什么类型的列表以及哪种for
循环。
迭代元素(而不是 indices )几乎肯定足够快。
另一方面,迭代索引并反复按索引获取元素对于某些类型的列表(例如链接列表)可能效果不佳。
答案 1 :(得分:1)
我的理解是你有List1和List2,并且想要找到效果最好的方法来查找result[index] = List1[index] + list2[index]
我的主要建议是,在开始优化性能之前,要先测量是否需要进行优化。您可以按照说法迭代列表,例如:
for(int i = 0; i < listSize; i++)
{
result[i] = List1[i] + List2[i];
}
在大多数情况下,这很好。请参阅NPE's answer,了解这可能是多么昂贵的地方,即链接列表。另请参阅this answer并注意for循环的每一步都是在一个数组上执行,它是在一个步骤中完成的,但是在一个链表中,它完成的步骤是迭代到列表中的元素。
假设一个标准数组,这是O(n)并且(取决于数组大小)将很快完成,几乎不会导致性能分析的昙花一现。
作为一种扭曲,由于操作完全独立,即result[0] = List1[0] + List2[0]
独立于result[1] = List1[1] + List2[1]
等,您可以并行运行这些操作。例如。你可以在一个线程上运行计算的前半部分(&lt; = List.Size / 2),在另一个线程上运行另一半(&gt; List.Size / 2)并预计经过的时间大致减半(假设至少2个免费CPU)。现在,使用的最佳线程数取决于数据的大小,CPU的数量,同时发生的其他操作,通常最好通过在不同条件下进行测试和建模来确定。所有这些都增加了程序的复杂性,因此我的主要建议是从简单开始,然后测量,然后决定是否需要优化。
答案 2 :(得分:1)
除了你有一个矩阵API(例如OpenGL)之外,循环是不可避免的。您可以实现由原始列表支持的List<Integer>
:
public class CalcList implements List<Integer> {
private List<Integer> l1, l2;
@Override
public int get(int index) {
return l1.get(index) + l2.get(index);
}
}
这可以避免复制操作并在堆栈末尾移动计算:
CalcList<Integer> results1 = new CalcList(list, list1);
CalcList<Integer> results2 = new CalcList(results1, list3);
// no calculation or memory allocated until now.
for (int result : results2) {
// here happens the calculation, still without unnecessary memory
}
如果编译器能够将其转换为:
,这可能会带来优势for (int i = 0; i < list1.size; i++) {
int result = list1[i] + list2[i] + list3[i] + …;
}
但我对此表示怀疑。您必须针对特定用例运行基准测试,以确定此实现是否具有优势。
答案 3 :(得分:0)
Java没有附带地图样式函数,因此执行此类操作的方法是使用for循环。 即使你使用其他一些构造,无论如何都会进行循环。另一种方法是使用GPU进行计算,但这不是默认的Java功能。 使用数组也应该比使用链表操作更快。