数组Java 8流,仅第一次获取max()需要很长时间
我有一个HashMap
,它将Integer
作为键,整数数组作为值,HashMap<Integer, Integer[]>()
所以每次我在另一个数组上循环时,我都试图获得最大值(数组大小),例如:
long startTime = System.currentTimeMillis();
result[i] = map.entrySet().stream().mapToInt(element -> element.getValue().size()).max().getAsInt() + 1;
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println( totalTime);
当我在不同的输入上运行这个程序几次后,我第一次总是得到很高的延迟,例如:
29 // <- First time
0
0
0
0
0
使用循环:
long startTime = System.currentTimeMillis();
for (Map.Entry<Integer, List<Integer>> element: map.entrySet()) {
result[i] = result[i] < element.getValue().size() ? element.getValue().size() : result[i];
}
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println( " " + totalTime);
输出:
0
0
0
0
0
0
当然,这是大投入的一个大问题,那么这里出了什么问题
# 1 楼答案
这是因为JVM在第一次调用Lambda时会动态生成一个新类。之后,这个类就可以重用了。这就是为什么你第一次有很高的延迟
此外,重要的是要了解lambda并不总是最佳选项,特别是对于可以通过使用良好的旧循环来完成的简单操作This article内容丰富,对于那些对流性能感兴趣的人来说是一本不错的读物