java8 lambda 原理及性能
所属分类 java8
浏览量 813
函数式接口 functional interface
只包含一个抽象方法的接口
@FunctionalInterface
java.lang.Runnable 和 java.util.Comparator 是典型的函数式接口
void run()
int compare(T o1, T o2);
Lambda语法
(parameters) -> expression
(parameters) -> { statements; }
javap -c xxx 查看字节码
jvm invoke指令
invokeinterface 调用接口方法
invokespecial 专门用来调用父类方法、私有方法和初始化方法
invokestatic 调用静态方法
invokevirtual 调用对象的一般方法
java7 增加 invokedynamic 指令
用于支持动态语言,允许方法调用在运行时指定类和方法
字节码中每条invokedynamic指令出现的位置称为一个动态调用点
Lambda 使用 invokedynamic指令
Lambda性能
Java8中 任何一种新方式都会产生约 5 倍的性能差异
使用简单迭代器循环比混合 lambda 表达式和流更有效
这样需要多写几行代码,且需要跳过甜蜜的语法糖(syntactic suger)
并行流 谨慎使用
性能对比 ,差距不是很大
普通 for 循环 稍微快一点
LambdaPerfTest
for(指定初始容量)
for(不指定初始容量)
stream+lambda
stream+方法引用
四种方式耗时对比
447 1176 1345 1331
792 1061 1504 1201
782 1002 1214 1206
792 1030 1234 1213
810 1041 1218 1210
812 1004 1260 1286
812 1025 1208 1202
788 1001 1206 1303
833 1072 1367 1237
801 1005 1220 1203
783 1007 1227 1221
797 1012 1234 1202
784 1009 1213 1302
911 1241 1361 1216
788 1013 1238 1204
821 1065 1239 1225
832 1022 1222 1426
809 1014 1218 1209
808 1039 1329 1323
925 1191 1267 1302
875 1024 1221 1233
完整代码
https://gitee.com/dyyx/hellocode/blob/master/src/dyyx/java8/lambda/LambdaPerfTest.java
上一篇
下一篇
aerospike启动指定配置文件
Java8函数式接口
Java8常用函数式接口
aerospike 日志
aerospike ClusterStats 获取连接数信息
alpinelinux