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类中,我运行了经过测试的方法三次以预热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);
我在具有Java版本1.8.0_05的i5 4核心CPU上运行了该程序
经典 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毫秒