使用"when"而不是"if-else"的任何性能成本?

Aba*_*Aba 6 kotlin

在开发过程中,我发现与使用when相比,使用看起来更好if-else.所以,我很好奇在简单的情况下使用when而不是典型if-else的情况会对性能产生影响(即使它很小).一个例子是:

val someNumber = when (someObject) {
    null -> 0
    else -> someCalculation()
}
Run Code Online (Sandbox Code Playgroud)

val someNumber = if (someObject == null) {
    0
} else {
    someCalculation()
}
Run Code Online (Sandbox Code Playgroud)

两者之间有性能差异吗?

s1m*_*nw1 11

tl;博士:不,你不应该期望when减慢任何事情.

编译器重用if/else,switch和三元运算符构造来表达when语句.举个例子:

fun whenApplication(someObject: String?) = when (someObject) {
    null -> 0
    else -> 2
}
Run Code Online (Sandbox Code Playgroud)

它的字节码显示为Java代码:

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

这里显示了稍微复杂的测试时间:

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

和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;
}
Run Code Online (Sandbox Code Playgroud)

  • 我将添加`when`不_always_编译成`if`链:根据情况,它可能是`switch`,通常更快! (2认同)