代码之家  ›  专栏  ›  技术社区  ›  Aba

使用“when”而不是“if else”是否会带来性能成本?

  •  10
  • Aba  · 技术社区  · 8 年前

    在开发过程中,我发现使用 when 比起 if-else 。所以我很好奇 什么时候 而不是典型的 如果其他 在简单的情况下会对性能产生影响(即使影响很小)。例如:

    val someNumber = when (someObject) {
        null -> 0
        else -> someCalculation()
    }
    

    val someNumber = if (someObject == null) {
        0
    } else {
        someCalculation()
    }
    

    两者之间是否存在性能差异?

    1 回复  |  直到 8 年前
        1
  •  20
  •   s1m0nw1    8 年前

    tl;医生:不,你不应该期望 when 放慢速度。

    编译器重用if/else、switch和三元运算符构造,以表示 什么时候 声明。举个例子:

    fun whenApplication(someObject: String?) = when (someObject) {
        null -> 0
        else -> 2
    }
    

    其字节码显示为Java代码:

    public static final int whenApplication(@Nullable String someObject) {
       return someObject == null ? 0 : 2;
    }
    

    此处显示的测试稍微复杂一些:

    fun whenApplication(someObject: Any?) = when (someObject) {
        is Int -> 2
        in 0..2 -> 4
        else -> 5
    }
    

    对应的字节码为Java:

    public static final int whenApplication(@Nullable Object someObject) {
        int var10000;
        if (someObject instanceof Integer) {
           var10000 = 2;
        } else {
           byte var2 = 0;
           var10000 = CollectionsKt.contains((Iterable)(new IntRange(var2, 2)), someObject) ? 4 : 5;
        }
    
        return var10000;
    }