Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java流的工作速度比for循环慢_Java_Algorithm_Java Stream - Fatal编程技术网

Java流的工作速度比for循环慢

Java流的工作速度比for循环慢,java,algorithm,java-stream,Java,Algorithm,Java Stream,我被告知Java流是处理大量数据的好选择,我最近做了一个比较测试。但是,测试结果出乎意料: 问题来自CodeWar: 假设有一个100人的地铁,在每一站都有几个人上车,几个人下车。我们的目标是统计大量停靠后留在地铁的人数(100000) 这是我的密码: import java.util.ArrayList; public class Metro1 { private final static int STOPS = 100000; private static ArrayLis

我被告知Java流是处理大量数据的好选择,我最近做了一个比较测试。但是,测试结果出乎意料:

问题来自CodeWar:

假设有一个100人的地铁,在每一站都有几个人上车,几个人下车。我们的目标是统计大量停靠后留在地铁的人数(100000)

这是我的密码:

import java.util.ArrayList;

public class Metro1 {
    private final static int STOPS = 100000;
    private static ArrayList<int[]> metro = new ArrayList<int[]>();

    public static int sum1() {
        int sum = 0;
        for(int[] x: metro) {
            sum +=x[0] - x[1];
        }
        return sum;
    }

    public static int sum2() {
        return metro.stream()
                .mapToInt(x -> x[0]-x[1])
                .sum();
    }
    public static void main(String[] args) {
        long start=0;
        long end = 0;
        metro.add(new int[] {100,0});
        for(int i=1;i<STOPS;i++) {
            int in = (int) Math.round(Math.random() * 10);
            int out = (int) Math.round(Math.random() * 10);
            metro.add(new int[] {in,out});
        }
        System.out.println("Stops: " + metro.size());

        start = System.currentTimeMillis();
        System.out.println("sum1: " + sum1());
        end = System.currentTimeMillis();
        System.out.println("sum1 (for loop): " + String.valueOf(end-start) + " milliseconds.");


        start = System.currentTimeMillis();
        System.out.println("sum2: " + sum2());
        end = System.currentTimeMillis();
        System.out.println("sum1 (stream): " + String.valueOf(end-start) + " milliseconds.");

    }

}
我认为代码足够简单,但是为什么流比for循环慢呢

谢谢


Alex

就像
regexes
一样,特定的自产解析器可以更快,流也可以提供快速简洁的数据处理方法。流的优点之一是在处理元素时可以最小化中间数据结构。另一个是注释中已经提到的并行方面

但是关于你的例子

  • 仅仅依靠使用内部时钟的性能测试(即使我也这样做)并不是准确评估性能的最佳方法。使用类似的方法进行测试
  • 至于您的结果,请尝试以下方法:

    • 停止
      更改为
      100\u 000\u 000
    • 将您的流修改为
      返回metro.stream().parallel()
      .mapToInt(x->x[0]-x[1])
      .sum()
以下是我的
Windows四核i7笔记本电脑上的结果

Stops: 100000000
sum1: -7073
sum1 (for loop): 908 milliseconds.
sum2: -7073
sum1 (stream): 518 milliseconds.


流式API更注重代码的可读性和可维护性。For循环可能提供更好的性能,但有时性能可能不是衡量的重要指标。拥有可维护的代码同样重要


我们可以对非常大的数据集使用并行流,但同样不能保证更好的性能,因为这涉及到其他开销,并且取决于可用资源

流速度比循环慢,这仅仅是因为它们做的工作更多。其优点主要是可读性(和并行化;但并行流的使用频率远远低于您所相信的围绕流的吹扫)。你有一个搜索引擎,不是吗?这能回答你的问题吗?谢谢然而,即使我使用parallel(),我也无法使流运行得更快,事实上,在发布此问题之前,我确实尝试过parallel。我的笔记本电脑是双核mac电脑。我仔细检查了我的代码,发现里面有一个bug。现在,使用parallel()的流运行得更快,与for循环几乎相同。再次感谢您提供的详细信息!
Stops: 100000000
sum1: -7073
sum1 (for loop): 908 milliseconds.
sum2: -7073
sum1 (stream): 518 milliseconds.