对通过java中的列表进行迭代的各种方法的性能评估

时间:2015-06-04 14:34:26

标签: java performance lambda java-8

我在java中创建了一个包含10个数字的整数列表。我想得到列表中数字的总和。为此,我使用了四种方法迭代列表并返回总和。代码为同样如下。

public static void main(String[] args) {

    List<Integer> numbers=Arrays.asList(1,5,10,25,30,17,3,9,11,26);

    //Using simple for loop for finding sum of numbers in the list
    System.out.println(sumOfNumbersUsingSimpleForLoop(numbers));

    //Using listIterator interface for finding sum of numbers in the list
    System.out.println(sumOfNumbersUsingIterableInterface(numbers));

    //Using enhanced for loop for finding sum of numbers in the list
    System.out.println(sumOfNumbersUsingEnhancedForLoop(numbers));

    //Using lambda expression for finding sum of numbers in the list
    System.out.println(sumOfNumbersUsingLambdaExpression(numbers));



}
public static int sumOfNumbersUsingSimpleForLoop(List<Integer> numbers)
{
    int sum=0;
    for(int i=0;i<numbers.size();i++)
    {
        sum=sum+numbers.get(i);
    }
    return sum;
}
public static int sumOfNumbersUsingIterableInterface(List<Integer> numbers) 
{
    int sum=0;
    ListIterator<Integer> iterator=numbers.listIterator();
    while(iterator.hasNext())
    {

            sum=sum+iterator.next();

    }
    return sum;
}
public static int sumOfNumbersUsingEnhancedForLoop(List<Integer> numbers) 
{
    int sum=0;
    for(int number:numbers)
    {
        sum=sum+number;
    }
    return sum;
}
public static int sumOfNumbersUsingLambdaExpression(List<Integer> numbers) 
{
    return numbers.stream().parallel().reduce(0, (e,num)->e+num);
}

所有这些方法都返回137作为结果。对于我来说,使用lambda表达式来计算总和是很方便的。但是如果列表的大小变得很高,我不确定它的性能。这将是非常有用的如果有人可以说明所有方法的性能比较。

2 个答案:

答案 0 :(得分:2)

在您的情况下,顺序流不能比for循环更快(流也将循环遍历列表,但有一些开销)。 for循环应该是等效的。

甚至更多的情况是你的流示例比for循环版本引发了更多的装箱/拆箱操作。您可以通过以下方式改进:

return numbers.parallelStream().mapToInt(Integer::intValue).sum();

如果列表很大,并行流可能会更快(我的猜测是:高于10k +元素 - 低于并行化的开销可能太高)。

如果你真的需要表现,你应该使用原语......

答案 1 :(得分:1)

lambda示例中可能遇到的唯一假设性能问题是它并行化。这导致JVM启动一些具有固有开销成本的线程,加上显然的通信成本。也就是说,如果你同时处理十亿个整数,那么在大多数情况下,并行化版本可能会运行得更快。如果你试图运行它会有性能问题很多因为缺少内核和物理CPU。您可以使用单线程示例更轻松地预测成本,但只要它不被多次调用(例如通过真正常用的REST API),它就会在大型列表上运行得更快。