我這只是前幾天做;我們不得不總結一個非常大陣,想知道什麼是做的最快方法 - 所以我測(不用猜,我用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
@nantitv我會讓你的痛苦變得誠實;但是關於代碼更具可讀性的部分對我來說已經變得如此之大 - 我真的很難用流讀取java-8之前的代碼,即使是那些毫秒也無法完成它......當然,這並不重要(速度損失),直到它確實 - 可能就是你被「擊中」...... – Eugene