【问题标题】:Performance of sequential stream顺序流的性能
【发布时间】:2017-08-16 09:58:30
【问题描述】:

我阅读了“何时使用并行流?”由 DougLea et.al http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html.

我想知道是否有人有指导方针(做/不做)/观察,让他们觉得旧的编码方式在某些情况下比顺序流更好? 我在这里找到了一个https://jaxenter.com/java-performance-tutorial-how-fast-are-the-java-8-streams-118830.html

我知道这是一个抽象的问题,但如果有人可以分享他们在 seq 流与 java 7 方式的性能方面的经验,将会很有帮助

【问题讨论】:

    标签: java-stream


    【解决方案1】:

    我几天前才这样做;我们必须对一个非常大的数组求和,并且想知道最快的方法是什么——所以我测量了(不要猜;我用过jmh):

    @State(Scope.Thread)
    public static class Holder {
    
        @Param({ "1000", "10000", "50000", "100000", "1000000" })
        public int howManyEntries;
    
        int array[] = null;
    
        @Setup
        public void setUp() {
            array = new int[howManyEntries];
            for (int i = 0; i < howManyEntries; ++i) {
                array[i] = i;
            }
        }
    
        @TearDown
        public void tearDown() {
            array = null;
        }
    }
    
    @Fork(1)
    @Benchmark
    public int iterative(Holder holder) {
    
        int total = 0;
        for (int i = 0; i < holder.howManyEntries; ++i) {
            total += holder.array[i];
        }
    
        return total;
    }
    
    @Fork(1)
    @Benchmark
    public int stream(Holder holder) {
        return Arrays.stream(holder.array).sum();
    }
    
    @Fork(1)
    @Benchmark
    public int streamParallel(Holder holder) {
        return Arrays.stream(holder.array).parallel().sum();
    }
    

    获胜者是总是老式的 java-7 方式。

    // 1000=[iterative, stream, streamParallel]
    // 10000=[iterative, stream, streamParallel]
    // 50000=[iterative, stream, streamParallel]
    // 100000=[iterative, stream, streamParallel]
    // 1000000=[iterative, stream, streamParallel]
    

    即使是 100 万个元素。但结果会在 60 毫秒内有所不同 - 是否会咬你完全是你的选择。

    流并不意味着速度,它们不会取代旧样式,它们也不想 - 例如,它可以为您的代码增加额外的可见性。

    【讨论】:

    • 感谢分享。我理解流方式提供的代码可读性。现在有一天,我倾向于以流的方式编写所有内容,但反省后我发现我应该在某个地方使用旧样式以获得更好的性能。这就是为什么我在寻找现实生活中该做的和不该做的
    • @nantitv 老实说,我明白你的痛苦;但是关于代码更具可读性的部分对我来说变得如此重要 - 我真的很难阅读带有流的 pre java-8 代码,即使是那些毫秒也无法做到......当然,这无关紧要(速度损失),直到它发生 - 可能就是你被“击中”了......
    猜你喜欢
    • 2017-05-27
    • 1970-01-01
    • 2019-06-11
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多