Kotlin中Extension Function与Infix Functions是否存在性能差异?
Kotlin扩展函数与中缀函数的性能差异
结论先行:两者不存在本质的性能差异——中缀函数只是一种语法糖,它和扩展函数不是同一维度的概念,甚至中缀函数本身就可以是扩展函数。
中缀函数是调用方式的语法糖
中缀函数的核心是允许你用空格代替.和括号来调用函数,它本身不改变函数的底层实现。只要函数满足两个条件:是成员函数或扩展函数,且只有一个参数,就能用infix修饰符变成中缀函数。比如:// 扩展函数+中缀语法 infix fun Int.multiplyBy(num: Int) = this * num // 两种调用方式等价 println(5.multiplyBy(3)) // 普通调用 println(5 multiplyBy 3) // 中缀调用这两种调用编译后对应的字节码完全一样,没有额外的性能开销。
扩展函数的底层实现
Kotlin的扩展函数编译后会被转为静态方法,把原类型的实例作为第一个参数传入。比如上面的multiplyBy编译成Java等价代码是这样的:public static int multiplyBy(int $this$multiplyBy, int num) { return $this$multiplyBy * num; }不管你用普通
.调用还是中缀空格调用,最终都是执行这个静态方法,性能上没有区别。性能差异只来自实现逻辑
如果你觉得某个中缀函数和扩展函数运行速度不同,那一定是它们的函数体逻辑不一样,和“中缀”或“扩展”的语法形式无关。比如一个中缀函数内部做了循环计算,另一个扩展函数只是简单返回值,这种差异是实现导致的,不是语法本身的性能损耗。
内容的提问来源于stack exchange,提问作者Mert Ozan
相关产品推荐
相关产品推荐

