【问题标题】:Java 8 stream, getting max() take long time for first time onlyJava 8 流,获取 max() 仅第一次需要很长时间
【发布时间】:2019-03-10 00:43:31
【问题描述】:

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

当然这是大输入的大问题,那么这里出了什么问题?

【问题讨论】:

  • 我不明白为什么它与另一个问题重复。他不想做一个基准
  • 你把你的代码放在一个for循环中了吗?你能粘贴你的完整代码吗?
  • @howie 我会把它放入for循环并发布结果;
  • 你的第二个输出似乎是矛盾的!
  • @nullpointer 你是什么意思?

标签: java arrays java-stream


【解决方案1】:

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

此外,重要的是要了解 Lambda 并不总是最佳选择,特别是对于可以通过使用良好的旧循环来完成的简单操作。 This article 内容丰富,非常适合对 Stream 性能感兴趣的人阅读。

【讨论】:

猜你喜欢
  • 2019-04-15
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多