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) { ; }