有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

数组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) 个答案

  1. # 1 楼答案

    这是因为JVM在第一次调用Lambda时会动态生成一个新类。之后,这个类就可以重用了。这就是为什么你第一次有很高的延迟

    此外,重要的是要了解lambda并不总是最佳选项,特别是对于可以通过使用良好的旧循环来完成的简单操作This article内容丰富,对于那些对流性能感兴趣的人来说是一本不错的读物