我有一个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
当然,对于大输入来说这是一个大问题,那么这里出了什么问题呢?
最佳答案
发生这种情况是因为第一次调用 Lambda 时 JVM 会动态生成一个新类。之后这个类就可以被复用了。这就是为什么您第一次会有很高的延迟。
此外,重要的是要了解 Lambda 并不总是最佳选择,特别是对于可以通过使用良好的旧循环来完成的简单操作。 This article对于对 Stream 性能感兴趣的人来说,内容丰富,是一本相当不错的读物。
关于Java 8流,获取max()仅第一次需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55083433/