Lambda表达式更慢?

时间:2016-10-09 09:33:00

标签: 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, 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时间?

1 个答案:

答案 0 :(得分:3)

第一次使用lambda时,JVM必须生成类的字节代码并加载它。第一次使用lambda时,大多数lambda代码生成库都被加载了。

我发现使用Lambda Comparator可能会更慢。很可能在未来的版本中情况并非如此。更重要的是,lambda代码肯定需要加载并加热以保持快速。

您的代码运行时间不够长。在进行任何测量之前,我会将代码加热至少2到10秒

使用比较器对大型列表进行排序时,可以将其称为N log2 N次,这很多。任何效率低下都显得非常重要。