首页 > 解决方案 > 内联常量 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 代码是否每次都会产生成本感兴趣)

标签: javakotlin

解决方案


天真的推理。

setOf( vararg )call 进行两次集合分配:

  1. Array对于可变参数
  2. 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 大小。与kotlincDX/D8/R8/Proguard/Redex 一起将缩小、优化和混淆您的应用程序代码。

同样,在运行时,您的代码会有所不同。

tl;博士

根据项目/公司编码约定做出决定。如果在这种情况下约定是灵活的,则使用对您来说更容易调试的任何东西。


推荐阅读