java - 内联常量 Set 声明是否有成本?
问题描述
假设我有以下 Kotlin 代码:
fun isBlue(color: String) = color in setOf("blue", "aqua", "cerulean", "navy", "turquoise")
每次函数运行时在函数体中声明 Set 是否会产生创建 Set 的成本,或者可以对其进行优化吗?
这应该是以下内容吗?
private val BLUE_COLORS = setOf("blue", "aqua", "cerulean", "navy", "turquoise")
fun isBlue(color: String) = color in BLUE_COLORS
(我也对等效的 Java 代码是否每次都会产生成本感兴趣)
解决方案
天真的推理。
setOf( vararg )
call 进行两次集合分配:
Array
对于可变参数LinkedHashSet
private val BLUE_COLORS = setOf("blue", "aqua", "cerulean", "navy", "turquoise")
fun isBlue(color: String) = color in BLUE_COLORS
应该更好,因为我们setOf
每次调用时都没有调用isBlue
,而是对 init 进行了一次调用。
没那么天真。
它取决于目标平台和运行时。
setOf()
是一个纯粹的、无副作用的函数,因此它是一个很好的优化目标
虚拟机
这取决于应用程序配置文件。基于配置文件 JIT 编译器将(去)优化这个代码块。
会发生什么:
- 内联
- 概述
- 基于分支预测的优化阅读更多
因此,编译器非常聪明,您不太可能在运行时看到任何差异
安卓
Android 有一个额外的维度 - APK 大小。与kotlinc
DX/D8/R8/Proguard/Redex 一起将缩小、优化和混淆您的应用程序代码。
同样,在运行时,您的代码会有所不同。
tl;博士
根据项目/公司编码约定做出决定。如果在这种情况下约定是灵活的,则使用对您来说更容易调试的任何东西。
推荐阅读
- ruby - 如何在 jekyll 网站中添加谷歌翻译插件?
- django - 为什么 django 迁移会暂时占用磁盘空间?
- algorithm - 贪心算法交换证明(算法设计,第 4 章,第 6E 章)
- javascript - 如何在 Nightwatch JS 中对伪元素进行断言
- javascript - 尝试转换 CSV 文件时出现 InvalidStateError
- c++ - 如何让我的程序接受指针?
- android - Android Room 数据库可以存储多少 Kbs/Mbs/Gbs 的数据?
- angular - 角度错误-“赋值表达式的左侧可能不是可选属性 access.ts”?
- java - StackOverflow 错误 - 带有 HashMap 的 JPA 实体
- python - 人脸中的 ,_,_ 是什么意思,_,_ =detector.run(image = imgR, upsample_num_times = 0, adjust_threshold = 0.0)?