gpt4 book ai didi

java - Kotlin 内联函数是否比 Java 匿名类便宜?

转载 作者:IT老高 更新时间:2023-10-28 13:35:48 26 4
gpt4 key购买 nike

请注意:我是凭内存写的,所以我可能有些概念不正确。


Java 具有编写匿名函数的能力。当您有某种事件的监听器接口(interface)时,这很有用。举个例子:

button.setOnClickListener(new View.OnClickListener(View v) {
@Override
public void onClick(View v) {
// handle the action here
}
});

匿名监听器将被编译为类似于 OnClickListener$1.class 的类。这是 Java 语言的底层设计决策。一切都是对象,甚至是匿名函数。

当您想要编写功能更强大的代码库时,这会成为一个问题。大量的匿名类创建了大量的类,这在 Android 等受限平台上可能是一个问题。

从源代码的角度来看,Kotlin 中的函数更加一流。我的问题是,Kotlin 将这些函数编译成字节码是否比 Java 对匿名类更有效,还是我会遇到与 Java 中的大类计数相同的问题?

谢谢,

最佳答案

简短的回答是是的,Kotlin 内联函数非常便宜。

当编译内联函数调用时,传递给调用的 lambda 被内联到函数体中,而函数体又在调用点被内联。这允许编译器不为 lambda 主体生成任何额外的类或方法。

Compilation of an inline function

the slides 之一关于 Kotlin 构造编译由 @yole . 不幸的是,我只找到了in Russian 的记录。 .其他幻灯片也很有趣,您可以在此处找到有关非内联 lambda 的更多信息。

一般来说,使用带有 lambda 的内联函数的 Kotlin 代码比带有 lambda 或 Streams 的相同 Java 代码运行得更快。所有代码绑定(bind)都是在编译时完成的,没有虚拟方法调用的运行时开销,也没有增加方法的数量,这对 Android 很重要。

过度内联的缺点是代码大小增长:内联函数体的字节码的公共(public)部分实际上在调用站点被复制。此外,内联使调试复杂化,因为代码的行号和调用堆栈将与源文件中的不同。虽然 IDE 支持在这里可以提供帮助。

我建议您自己尝试内联函数:您可以轻松地 inspect the resulting bytecode ;当然,还可以对性能很重要的特定用例进行一些基准测试。

关于java - Kotlin 内联函数是否比 Java 匿名类便宜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44059908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com