按元素添加2个列表元素

时间:2014-01-12 10:04:47

标签: java performance

我有2个列表,并希望逐个元素添加它们。像那样:

enter image description here

是否有一种更简单的方法,可能比使用well performing way迭代第一个列表并将其添加到结果列表更多for loop

感谢您的回答!

4 个答案:

答案 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功能。 使用数组也应该比使用链表操作更快。