TL; DR :List.stream().forEach()
是最快的。
我觉得我应该添加基准测试迭代的结果。我采用了一种非常简单的方法(没有基准测试框架)并对 5 种不同的方法进行了基准测试:
- 经典的
for
- 经典的 foreach
List.forEach()
List.stream().forEach()
List.parallelStream().forEach
测试程序和参数
private List<Integer> list;
private final int size = 1_000_000;
public MyClass(){
list = new ArrayList<>();
Random rand = new Random();
for (int i = 0; i < size; ++i) {
list.add(rand.nextInt(size * 50));
}
}
private void doIt(Integer i) {
i *= 2; //so it won't get JITed out
}
此类中的列表将被迭代,并有一些doIt(Integer i)
应用于它的所有成员,每次都通过不同的方法。在 Main 类中,我运行了 3 次测试方法来预热 JVM。然后我运行测试方法 1000 次,将每个迭代方法所需的时间相加(使用System.nanoTime()
)。完成后,我将该总和除以 1000,这就是平均时间的结果。例子:
myClass.fored();
myClass.fored();
myClass.fored();
for (int i = 0; i < reps; ++i) {
begin = System.nanoTime();
myClass.fored();
end = System.nanoTime();
nanoSum += end - begin;
}
System.out.println(nanoSum / reps);
我在 i5 4 核 CPU 上运行它,java 版本为 1.8.0_05
经典的for
for(int i = 0, l = list.size(); i < l; ++i) {
doIt(list.get(i));
}
执行时间:4.21 毫秒
经典的 foreach
for(Integer i : list) {
doIt(i);
}
执行时间:5.95 毫秒
List.forEach()
list.forEach((i) -> doIt(i));
执行时间:3.11 毫秒
List.stream().forEach()
list.stream().forEach((i) -> doIt(i));
执行时间:2.79 毫秒
List.parallelStream().forEach
list.parallelStream().forEach((i) -> doIt(i));
执行时间:3.6 毫秒