我读过“何时使用并行流?”作者: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方式上的表现经验会很有帮助
答案 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不是为了提高速度,它们不会取代旧样式,也不会取代它们 - 例如,它可以为您的代码添加额外的可见性。