Kotlin是否保证范围检查不实例化Range?Android关键路径性能问询
Kotlin中
in范围表达式是否会产生垃圾对象? 完全放心用!Kotlin编译器对基本类型的范围检查做了专门的优化,不会因为你写x in rangeStart..rangeEnd而产生任何垃圾对象,性能和你原来的return x >= rangeStart && x <= rangeEnd完全一致。
具体来说,当你针对Int、Long、Char这类基本类型使用in配合..做范围判断时,编译器会直接把这个表达式编译成和手动写的边界比较完全等价的字节码——不会实例化任何IntRange或类似的范围对象,就是纯粹的数值比较操作。
如果你想要验证的话,在IntelliJ里可以通过Tools -> Kotlin -> Show Kotlin Bytecode查看编译后的字节码,再点击Decompile转成Java代码,会发现两种写法生成的代码完全一模一样。
只有当你把范围赋值给一个变量(比如val range = rangeStart..rangeEnd)时,才会创建对应的Range对象,但直接用in做即时检查的场景下,完全没有对象分配的开销。
所以在你的高流量事件处理关键路径里,这个修改完全安全,既不会产生垃圾,还能让代码更简洁易读。
内容的提问来源于stack exchange,提问作者Marko Topolnik
相关产品推荐
相关产品推荐

