roo*_*est 4 android function kotlin
是否有高阶函数的成本?我可以很容易地解决一些问题,但我不确定它是否会影响性能.对它有任何限制吗?
传递给高阶函数的 Lambdas 被编译为通用Function
对象.这种方法肯定会增加一些成本,这也是由于涉及原始类型时的装箱开销.
是的,它可以影响性能.你应该inline
在有意义的时候使用更高阶的函数,因为前面提到的警告将不再是问题.
取自文档:
使用高阶函数会产生某些运行时惩罚:每个函数都是一个对象,它捕获一个闭包,即在函数体中访问的那些变量.内存分配(包括函数对象和类)和虚拟调用都会引入运行时开销.
但似乎在许多情况下,通过内联lambda表达式可以消除这种开销.
但是有一些限制inline
.阅读文档.
高阶函数和调用者代码的定义:
fun hoFun(func: (Int) -> Boolean) {
func(1337)
}
//invoke with lambda
val mod = 2
hoFun { it % mod == 0 }
Run Code Online (Sandbox Code Playgroud)
字节码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;
}
}));
Run Code Online (Sandbox Code Playgroud)
如上所述,lambda被编译为一个Function
对象.每次调用都会导致新Function
对象的实例化,因为mod
需要捕获它们.非捕获lambda使用单例Function
实例.
通过将inline
修饰符应用于高阶函数,编译的调用看起来更好:
int mod = 2;
int it = 1337;
if (it % mod == 0) {
;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
360 次 |
最近记录: |