Kotlin编译器可以优化包装函数吗?

时间:2017-10-20 22:22:44

标签: kotlin wrapper compiler-optimization

我是Kotlin的新手,但我想尝试将它用于游戏开发,至少针对使用OpenGL ES 2.0的Android和使用WebGL的HTML5(我非常熟悉)。不必为我的渲染引擎的WebGL和GLES20的类/函数略有不同版本显然是一件好事,但是有没有实用的方法在Kotlin中实现这一点而没有开销?

我认为我要做的是在OpenGL ES 2.0中编写一个实现WebGLRenderingContextBase的类或者它的克隆(如果需要克隆,我可以使用委托来实现WebGL),充满了这样的方法:

override fun bindBuffer(target: Int, buffer, Int) {
    GLES20.glBindBuffer(target, buffer)
}

我会编写一个脚本来完成大部分工作。

我的问题是,编译器是否足够智能以优化这些包装器并直接在我的类'vtable中使用GLES20.glBindBuffer等,或者JVM具有哪些等价物?当通过对接口或基类的引用调用重写方法时,推测inline是没有任何用处。

1 个答案:

答案 0 :(得分:2)

Kotlin编译器没有在这个范围内优化字节码,并且它不需要:JVM本身非常擅长优化代码。

此外,inline函数并非设计为Kotlin中的性能工具,而是用于非本地控制流和代码转换,如果没有内联则无法实现。

实际上,JVM执行了大量的优化,使编译器不必过多地优化他们生成的字节码。内联是JVM可以做的优化之一。 (1) (2) (3)

虽然两者都不是编译器nor JVM can inline native methods,因为本机代码的性质完全不同。

反过来,Kotlin编译器执行一些不影响程序整体结构的本地优化。这样做的另一个原因是调试经验,这很难通过大量优化来保留。要检查确切的Kotlin优化,可以尝试通过将-Xno-optimize flag添加到自由编译器参数来禁用它们,然后查看生成的字节码或进行一些基准测试。