Java8-13新特性中的Lambda表达式为什么运行效率低

前言

我为什么说Lambda表达式运行效率低。

先准备一个list:

List<Integer> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
    list.add(i);
}

先用Lambda表达式的方式来循环一下这个list:

long lambdaStart = System.currentTimeMillis();
list.forEach(i -> {
    // 不用做事情,循环就够了
});
long lambdaEnd = System.currentTimeMillis();
System.out.println("lambda循环运行毫秒数===" + (lambdaEnd - lambdaStart));

运行时间大概为110ms

再用普通方式来循环一下这个list:

long normalStart = System.currentTimeMillis();
for (int i = 0; i < list.size(); i++) {
    // 不用做事情,循环就够了
}
long normalEnd = System.currentTimeMillis();
System.out.println("普通循环运行毫秒数===" + (normalEnd - normalStart));

运行时间大概为0ms或1ms

你们没看错,运行时间差别就是这么大,不相信的话大家可以自己去试一下,并且这并不是只有在循环时使用Lambda表达式才会导致运行效率低,而是Lambda表达式在运行时就是会需要额外的时间,我们继续来分析。

分析

如果我们要研究Lambda表达式,最正确、最直接的方法就是查看它所对应的字节码指令。

使用以下命令查看class文件对应的字节码指令:

javap -v -p Test.class

上述命令解析出来的指令非常多,我这里提取比较重要的部分来给大家分析:

使用Lambda表达式所对应的字节码指令如下:

34: invokestatic  #6        // Method java/lang/System.currentTimeMillis:()J
37: lstore_2
38: aload_1
39: invokedynamic #7,  0    // InvokeDynamic #0:accept:()Ljava/util/function/Co
  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 27
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值