Groovy中的'switch'和'if'语句在性能方面的比较。

8

我知道在Java中,当你只有几个情况时,不应使用switch语句,而应该使用if else if语句。

那么在groovy中也是这样吗?

这两种代码哪个更高效?

myBeans.each{
    switch it.name
    case 'aValue':
        //some operation
    case 'anotherValue:
        //other operations
}

或者:

myBeans.each{
    if(it.name == 'aValue'){
        //some operation
    }
    else if (it.name =='anotherValue){
        //other operations
    }
}

4
这是一个真正的问题还是仅仅是好奇心?在实际应用中,这很可能不会成为性能瓶颈。如果你真的很好奇,为什么不运行一些测试来找出答案呢? - Jeff Storey
只是出于好奇,想知道在使用_switch_时JVM内部会发生什么。 - rascio
1个回答

14
在Java中,“switch”比串行if块更有效,因为编译器生成一个tableswitch指令,其中目标可以从跳转表中确定。
在Groovy中,switch不限于整数值,并且具有许多附加语义,因此编译器无法使用该功能。编译器生成一系列比较,就像对于串行if块一样。
但是,对于每个比较都会调用ScriptBytecodeAdapter.isCase(switchValue,caseExpression)。这始终是对caseExpression对象上的isCase方法的动态方法调用。该调用可能比对if比较调用的ScriptBytecodeAdapter.compareEqual(left,right)更昂贵。
因此,在Groovy中,switch通常比串行if块更昂贵。

1
只是出于好奇,您是否知道在使用静态编译的 Groovy 2.0 中有什么变化? - cdeszaq
有趣的问题,我刚刚检查了一下。正如我所预料的那样,它不会将调用转换为ScriptBytecodeAdapter。因此,尽管@CompileStatic强制在所选方法中进行静态方法调用,“switch”和“if”仍然通过ScriptBytecodeAdapter引入动态方法调用。 - Ingo Kegel
我在想这里是否可以进行可能的速度优化? - cdeszaq
我想如果不改变switch和equals的语义,这将是相当困难的。 - Ingo Kegel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接