Kotlin内联函数比Java匿名类更便宜吗?

Bra*_*rad 10 java kotlin

抬起头来:我正在从记忆中写下一些内容,所以我可能会有一些不正确的概念.


Java具有编写匿名函数的能力.当您拥有某种事件的侦听器接口时,这非常有用.举个例子:

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

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

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

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

谢谢,

hot*_*key 12

简短的回答是肯定的,Kotlin内联功能非常便宜.

编译内联函数调用时,传递给调用的lambdas会内联到函数体中,而函数体又在调用站点内联.这允许编译器不为lambda主体生成任何其他类或方法.

编译内联函数

一个幻灯片约科特林通过构建编译@yole.不幸的是,我发现只有俄语的记录.其他幻灯片也有一些兴趣,你可以在那里找到更多关于非内联lambda的信息.

通常,使用带有lambdas的内联函数的Kotlin代码比使用lambdas或Streams的相同Java代码工作得更快.所有代码绑定都是在编译时完成的,并且没有虚拟方法调用的运行时开销,也没有增加的方法计数,这对于Android来说很重要.

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

我建议你自己尝试内联函数:你可以轻松检查生成的字节码 ; 当然,对性能重要的特定用例做一些基准测试.