Java 8流,获取max()仅第一次需要很长时间

标签 java arrays java-stream

我有一个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/

相关文章:

java - 如何将 StreamEx 解包为 "Plain Old Java Stream"?

java - BinaryOpertor for List<Integer> 添加列表

java - 如何通过Java获取MySQL表中某一列的不同值的ID?

java - 尝试使用paintComponent画一个圆

c - 如何在 C 中生成对数间隔数组

java - 如何在 Java 8 中将 Map 转换为 List

java - 为什么我的上层函数在 MySQL Workbench 中有效,但在 Java/JDBC 中无效

java - Spock stub 在功能方法中不起作用

c - 使用 malloc 动态创建字符串数组

python - "Setting an array element with a sequence"numpy 错误