顺序流的性能

时间:2017-08-16 09:58:31

标签: java-stream

我读过“何时使用并行流?”作者: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 stream和java 7方式上的表现经验会很有帮助

1 个答案:

答案 0 :(得分: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毫秒内有所不同 - 如果咬你或不咬你完全是你的选择。

Streams不是为了提高速度,它们不会取代旧样式,也不会取代它们 - 例如,它可以为您的代码添加额外的可见性。