Performance groovy';开关';与';如果';演出
我知道在Java中,switch语句不应该在很少的情况下使用,在这种情况下,最好使用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块更有效,因为编译器生成一条指令,其中目
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
}
}