测试for,foreache,stream-foreach的性能
import java.util.ArrayList;
import java.util.List;
/**
* 测试for循环的性能
* @author leemeea
* @date 2021/8/13 11:11
*/
public class TestMain {
public static void main(String[] args) {
// 测试源
List<TestMain> sourceList = new ArrayList<>();
for (int i = 0; i < 10000000; i++) {
TestMain main = new TestMain();
main.setInteger(i);
main.setString("第" + i + "条数据");
sourceList.add(main);
}
System.out.println("数据条数:" + sourceList.size());
sourceList.parallelStream().forEach((t) -> doSome(t));
System.gc();
long a1 = System.currentTimeMillis();
for (int i = 0; i < sourceList.size(); i++){
doSome(sourceList.get(i));
}
long a2 = System.currentTimeMillis();
System.out.println("普通for循环用时:" + (a2 - a1));
System.gc();
long b1 = System.currentTimeMillis();
for (TestMain t : sourceList){
doSome(t);
}
long b2 = System.currentTimeMillis();
System.out.println("增强for循环用时:" + (b2 - b1));
System.gc();
long c1 = System.currentTimeMillis();
sourceList.forEach(
(t) -> doSome(t)
);
long c2 = System.currentTimeMillis();
System.out.println("forEach循环用时:" + (c2 - c1));
System.gc();
long d1 = System.currentTimeMillis();
sourceList.stream().forEach(
(t) -> doSome(t)
);
long d2 = System.currentTimeMillis();
System.out.println("forEach-stream循环用时:" + (d2 - d1));
System.gc();
long e1 = System.currentTimeMillis();
sourceList.parallelStream().forEach(
(t) -> doSome(t)
);
long e2 = System.currentTimeMillis();
System.out.println("forEach-parallelStream循环用时:" + (e2 - e1));
System.gc();
System.out.println(sourceList.get(0));
}
private static void doSome(TestMain main) {
main.setInteger(main.getInteger() +1);
main.setString(main.getString() +1);
// try {
// Thread.sleep(1);
// } catch (Exception e) {
// e.printStackTrace();
// }
}
private String string;
private Integer integer;
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public Integer getInteger() {
return integer;
}
public void setInteger(Integer integer) {
this.integer = integer;
}
@Override
public String toString() {
return "TestMain{" +
"string='" + string + '\'' +
", integer=" + integer +
'}';
}
}
感觉并没啥用-测不出来
java会对指令做优化,才疏学浅测试不出来
下图是上面代码出来的结果
总的来说,在日常使用场景中 foreach效果都很好,具体还是得看具体需求
参考:https://blog.csdn.net/SarielAngel/article/details/83899377