Performance groovy';开关';与';如果';演出

Performance groovy';开关';与';如果';演出,performance,groovy,switch-statement,Performance,Groovy,Switch Statement,我知道在Java中,switch语句不应该在很少的情况下使用,在这种情况下,最好使用if-else-if groovy也是这样吗 这两种代码之间哪一种性能更好 myBeans.each{ switch it.name case 'aValue': //some operation case 'anotherValue: //other operations } 或: 在Java中,“开关”比串行if块更有效,因为编译器生成一条指令,其中目

我知道在Java中,switch语句不应该在很少的情况下使用,在这种情况下,最好使用
if-else-if

groovy也是这样吗

这两种代码之间哪一种性能更好

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

在Java中,“开关”比串行if块更有效,因为编译器生成一条指令,其中目标可以从跳转表中确定

在Groovy中,switch不限于整数值,并且具有许多附加语义,因此编译器无法使用该功能。编译器生成一系列比较,就像它对串行if块所做的那样

但是,每次比较都会调用
ScriptBytecodeAdapter.isCase(switchValue,caseExpression)
。这始终是对caseExpression对象上的
isCase
方法的动态方法调用。该调用可能比用于if比较的
ScriptBytecodeAdapter.compareEqual(左、右)
更昂贵


所以在Groovy中,switch通常比串行if块更昂贵

这是一个真正的担忧还是一个好奇?在实际应用程序中,这不太可能成为性能瓶颈。如果你真的很好奇,为什么不运行一些测试并找出答案呢?我只是好奇地想知道当我使用switchOut时JVM内部发生了什么,你知道Groovy 2.0使用静态编译时对此有什么变化吗?有趣的问题,我刚刚检查过。正如我所料,它不会将调用更改为ScriptBytecodeAdapter。因此,尽管@CompileStatic强制在所选方法中调用静态方法,但“switch”和“if”仍然通过ScriptBytecodeAdapter引入动态方法调用。我想这是否不是一个可能进行速度优化的地方?我想如果不更改switch和equals的语义,这将相当困难。
myBeans.each{
    if(it.name == 'aValue'){
        //some operation
    }
    else if (it.name =='anotherValue){
        //other operations
    }
}