Android 的 Kotlin 扩展开销
Kotlin extension overhead for Android
在整个代码中使用 kotlin 扩展是个好主意吗?
我错过了很多来自 iOS 的扩展,但这是在 android 中使用这些东西的好方法吗?
参考http://antonioleiva.com/kotlin-android-extension-functions/
有更好的解决方案吗?
Kotlin 中的扩展函数被编译为正常的 Java 方法。例如,当您在包中定义一个函数时,它会变成 Java class 中的静态方法。与简单地调用静态实用程序相比没有开销
为了进一步扩展 Andrey Breslav 的回答,Kotlin 扩展函数会编译为静态 java 方法,因此大多数通用扩展函数不会产生任何开销。但是有一个极端情况你需要注意 Jake Wharton 在 this talk at Google IO 的前几分钟里喊出来的。
也就是说,当您将高阶函数 (lambda) 作为参数传递给扩展函数时,如下所示:
fun View.doSomething(block: () -> Unit) {
//do something
}
此代码会影响性能,因为 lambda 必须在幕后创建一个匿名 class,这会耗尽方法并导致 class 加载。这是一个非常简单的修复,通过将 inline
关键字添加到函数中,这实际上会将您的代码 内联 到所有这些调用站点函数中,这样您就不会每次都受到性能影响调用扩展函数的时间。
inline fun View.doSomething(block: () -> Unit) {
//do something
}
在整个代码中使用 kotlin 扩展是个好主意吗?
我错过了很多来自 iOS 的扩展,但这是在 android 中使用这些东西的好方法吗? 参考http://antonioleiva.com/kotlin-android-extension-functions/
有更好的解决方案吗?
Kotlin 中的扩展函数被编译为正常的 Java 方法。例如,当您在包中定义一个函数时,它会变成 Java class 中的静态方法。与简单地调用静态实用程序相比没有开销
为了进一步扩展 Andrey Breslav 的回答,Kotlin 扩展函数会编译为静态 java 方法,因此大多数通用扩展函数不会产生任何开销。但是有一个极端情况你需要注意 Jake Wharton 在 this talk at Google IO 的前几分钟里喊出来的。
也就是说,当您将高阶函数 (lambda) 作为参数传递给扩展函数时,如下所示:
fun View.doSomething(block: () -> Unit) {
//do something
}
此代码会影响性能,因为 lambda 必须在幕后创建一个匿名 class,这会耗尽方法并导致 class 加载。这是一个非常简单的修复,通过将 inline
关键字添加到函数中,这实际上会将您的代码 内联 到所有这些调用站点函数中,这样您就不会每次都受到性能影响调用扩展函数的时间。
inline fun View.doSomething(block: () -> Unit) {
//do something
}