Java Lambda表达式慢一点?
我有以下代码:Java Lambda表达式慢一点?,java,lambda,Java,Lambda,我有以下代码: PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>(dscsortedMAP.size(), new Comparator<Map.Entry<Integer, Integer>>() { @Override public int compare(Map.Entry<Integer, Intege
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());
}
});
PriorityQueue pq=new PriorityQueue(dscsortedMAP.size(),new Comparator()){
@凌驾
公共整数比较(Map.Entry arg0,Map.Entry arg1){
返回arg1.getValue().compareTo(arg0.getValue());
}
});
IntelliJ IDEA friendly建议我可以将上面的代码替换为lambda表达式,如下所示:
PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>(dscsortedMAP.size(), (arg0, arg1) -> {
return arg1.getValue().compareTo(arg0.getValue());
});
PriorityQueue pq=new PriorityQueue(dscsortedMAP.size(),(arg0,arg1)->{
返回arg1.getValue().compareTo(arg0.getValue());
});
好吧,猜猜发生了什么,在我的方法中,2的执行时间。代码执行速度慢了20倍?!第一个版本花了7毫秒对列表进行排序,在lambda表达式之后是140毫秒强>
我是不是遗漏了什么?我没有测试执行时间是否随着数据的增长而成比例增加。也许这只是最初的一次性cpu时间?第一次使用lambda时,JVM必须生成类的字节码并加载它。第一次使用任何lambda时,将加载大多数lambda代码生成库 我发现使用Lambda比较器会慢一些。在未来的版本中,可能不会出现这种情况。更重要的是,lambda代码肯定需要加载并预热以达到快速 您的代码运行时间不够长,无法显示。在进行任何测量之前,我会将代码预热至少2-10秒
当您使用比较器对一个大列表进行排序时,它可以被称为
nlog2n
次,次数很多。任何效率低下的问题都会显示为严重问题。谢谢。你能告诉我用什么来代替比较器对一个大的列表进行排序更好吗?事实上,如果您愿意,我可以用更多的代码为这个问题创建另一个问题。因为这里的排序有一个性能问题,Lambda字节码是在编译时生成的,就像其他匿名类一样。JVM不会生成任何code@Spring我想两个都试试看。@Jack从lambda.getClass()得到的类是在运行时生成的,该类的名称取决于JVM的版本。@PeterLawrey谢谢。我想不出原因——有人知道吗?看看你现在做了什么:你编辑了你的帖子,所以我的答案不再有意义了。既然两个函数中的代码都是相同的,那么在计时方面还存在这种差异吗?