TL;DR: List.stream(). foreach()是最快的。
我觉得我应该添加我的基准测试迭代的结果。
我采用了一个非常简单的方法(没有基准测试框架),并测试了5种不同的方法:
经典的
经典的foreach
List.forEach ()
.forEach List.stream () ()
.forEach List.parallelStream ()
测试程序和参数
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);
我在i5 4核CPU上运行这个程序,java版本为1.8.0_05
经典的
for(int i = 0, l = list.size(); i < l; ++i) {
doIt(list.get(i));
}
执行时间:4.21 ms
经典的foreach
for(Integer i : list) {
doIt(i);
}
执行时间:5.95毫秒
List.forEach ()
list.forEach((i) -> doIt(i));
执行时间:3.11 ms
.forEach List.stream () ()
list.stream().forEach((i) -> doIt(i));
执行时间:2.79 ms
.forEach List.parallelStream ()
list.parallelStream().forEach((i) -> doIt(i));
执行时间:3.6 ms