IDEA建議更換,例如,這樣的:IntelliJ IDEA建議用foreach方法替換循環。我是否應該儘可能地做到這一點?
for (Point2D vertex : graph.vertexSet()) {
union.addVertex(vertex);
}
與此:
graph.vertexSet().forEach(union::addVertex);
這個新版本是肯定更具有可讀性。但是在那種情況下,我最好堅持使用迭代表的舊語言結構,而不是使用新的方法?例如,如果我理解正確,方法引用機制意味着構造一個匿名Consumer
對象,否則(與for
語言構造)將不會構造。這會成爲某些行爲的性能瓶頸嗎?
所以我寫這個不是很詳盡的基準:
package org.sample;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.infra.Blackhole;
import org.tendiwa.geometry.Point2D;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class LanguageConstructVsForeach {
private static final int NUMBER_OF_POINTS = 10000;
private static final List<Point2D> points = IntStream
.range(0, NUMBER_OF_POINTS)
.mapToObj(i -> new Point2D(i, i * 2))
.collect(Collectors.toList());
@Benchmark
@Threads(1)
@Fork(3)
public void languageConstructToBlackhole(Blackhole bh) {
for (Point2D point : points) {
bh.consume(point);
}
}
@Benchmark
@Threads(1)
@Fork(3)
public void foreachToBlackhole(Blackhole bh) {
points.forEach(bh::consume);
}
@Benchmark
@Threads(1)
@Fork(3)
public List<Point2D> languageConstructToList(Blackhole bh) {
List<Point2D> list = new ArrayList<>(NUMBER_OF_POINTS);
for (Point2D point : points) {
list.add(point);
}
return list;
}
@Benchmark
@Threads(1)
@Fork(3)
public List<Point2D> foreachToList(Blackhole bh) {
List<Point2D> list = new ArrayList<>(NUMBER_OF_POINTS);
points.forEach(list::add);
return list;
}
}
,並得到:
Benchmark Mode Samples Score Error Units
o.s.LanguageConstructVsForeach.foreachToBlackhole thrpt 60 33693.834 ± 894.138 ops/s
o.s.LanguageConstructVsForeach.foreachToList thrpt 60 7753.941 ± 239.081 ops/s
o.s.LanguageConstructVsForeach.languageConstructToBlackhole thrpt 60 16043.548 ± 644.432 ops/s
o.s.LanguageConstructVsForeach.languageConstructToList thrpt 60 6499.527 ± 202.589 ops/s
如何來foreach
是在兩種情況下更有效:當我這樣做幾乎沒有,當我做一些實際工作? foreach
簡單封裝Iterator
?這個基準是否正確?如果是這樣,今天有沒有理由在Java 8中使用舊的語言結構?
相關的問題:http://stackoverflow.com/q/23265855/1441122和http://stackoverflow.com/q/16635398/1441122 – 2014-10-28 19:12:37
微基準只有他們的創造者在創造他們的專業知識一樣準確和有用。 microbenchmarks通常直接發揮鄧寧克魯格效應與預期的結果。 – 2014-10-28 19:13:54
@JarrodRoberson但是這個使用JMH,它有一個完善的方法和工具benchamrking。這個基準沒有任何東西來自我的專業知識,而不是從手冊到JMH。 – gvlasov 2014-10-28 19:17:46