Kotlin - 高阶函数成本?



高阶函数有成本吗? 我可以轻松解决一些问题,但我不确定它是否会影响性能。它有什么限制吗?

传递给高阶函数的 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) {
;
}

最新更新