高阶函数有成本吗? 我可以轻松解决一些问题,但我不确定它是否会影响性能。它有什么限制吗?
传递给高阶函数的 Lambda 被编译为泛型Function
对象。这种方法肯定会增加一些成本,这也是由于涉及基元类型时的装箱开销。
所以是的,它会影响性能。只要有意义,您应该使用inline
高阶函数,因为上述警告将不再有问题。
摘自文档:
使用高阶函数会施加某些运行时惩罚:每个函数都是一个对象,它捕获一个闭包,即在函数主体中访问的那些变量。内存分配(函数对象和类)和虚拟调用会引入运行时开销。
但似乎在许多情况下,这种开销可以通过内联 lambda 表达式来消除。
不过,inline
有一定的限制。阅读文档。
例
高阶函数和调用方代码的定义:
fun hoFun(func: (Int) -> Boolean) {
func(1337)
}
//invoke with lambda
val mod = 2
hoFun { it % mod == 0 }
字节码Java表示:
public static final void hoFun(@NotNull Function1 func) {
Intrinsics.checkParameterIsNotNull(func, "func");
func.invoke(1337);
}
final int mod = 2;
hoFun((Function1)(new Function1() {
public Object invoke(Object var1) {
return this.invoke(((Number)var1).intValue());
}
public final boolean invoke(int it) {
return it % mod == 0;
}
}));
如前所述,lambda 被编译为Function
对象。每次调用都会导致新Function
对象的实例化,因为需要捕获mod
。非捕获 lambda 改用单例Function
实例。
将inline
修饰符应用于高阶函数后,编译后的调用看起来要好得多:
int mod = 2;
int it = 1337;
if (it % mod == 0) {
;
}