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谢谢。我想不出原因——有人知道吗?看看你现在做了什么:你编辑了你的帖子,所以我的答案不再有意义了。既然两个函数中的代码都是相同的,那么在计时方面还存在这种差异吗?