我在下面有这段代码:
PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>(dscsortedMAP.size(), new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> arg0, Map.Entry<Integer, Integer> arg1) {
return arg1.getValue().compareTo(arg0.getValue());
}
});
比IntelliJ IDEA友好建议我可以将上面的代码替换为lambda表达式,如下所示:
PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>(dscsortedMAP.size(), (arg0, arg1) -> {
return arg1.getValue().compareTo(arg0.getValue());
});
好吧猜猜发生了什么,在我的方法中,执行时间2.执行时间慢了20倍?!第一个版本用 7毫秒对列表进行排序,在lambda表达式之后它是 140毫秒?!
我在这里遗漏了什么吗?我没有测试执行时间是否随着数据的增长而成比例地增加。也许那只是最初的一次cpu时间?
答案 0 :(得分:3)
第一次使用lambda时,JVM必须生成类的字节代码并加载它。第一次使用lambda时,大多数lambda代码生成库都被加载了。
我发现使用Lambda Comparator可能会更慢。很可能在未来的版本中情况并非如此。更重要的是,lambda代码肯定需要加载并加热以保持快速。
您的代码运行时间不够长。在进行任何测量之前,我会将代码加热至少2到10秒。
使用比较器对大型列表进行排序时,可以将其称为N log2 N
次,这很多。任何效率低下都显得非常重要。