Kotlin – 高阶函数成本?
高阶函数是否有成本? 我可以很容易地解决一些问题,但我不确定它是否会影响性能。 这有什么限制吗?
传递给高阶函数的 Lambdas被编译成通用Function
对象。 这种方法肯定会增加一些成本,也是由于涉及原始types时的开销造成的。
所以是的,它可以影响性能。 你应该使用inline
高阶函数,因为前面提到的注意事项不会有问题了。
从文档采取:
使用高阶函数会施加一定的运行时间惩罚 :每个函数都是一个对象,它捕获一个闭包,即在函数体中访问的那些variables。 内存分配(对于函数对象和类)和虚拟调用都会引入运行时间开销。
但是在很多情况下, 通过内联lambdaexpression式可以消除这种开销 。
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
。 非捕获lambdas使用单例Function
实例。
使用inline
修饰符应用于高阶函数时,编译的调用看起来好多了:
int mod = 2; int it = 1337; if (it % mod == 0) { ; }