groovy "switch" против " if " производительность

Я знаю, что на Java переключатель оператор не должен использоваться, когда у вас есть несколько случаев, и в этом случае лучше использовать 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
    }
}

1 ответов


в Java "switch" более эффективен, чем последовательные блоки if, потому что компилятор генерирует tableswitch инструкция, где цель может быть определена из таблицы прыгнуть.

в Groovy switch не ограничивается целочисленными значениями и имеет много дополнительной семантики, поэтому компилятор не может использовать это средство. Компилятор генерирует серию сравнений, так же как и для последовательных блоков if.

, ScriptBytecodeAdapter.isCase(switchValue, caseExpression) вызывается для каждого сравнение. Это всегда динамический вызов метода isCase метод для объекта caseExpression. Этот вызов потенциально дороже, чем ScriptBytecodeAdapter.compareEqual(left, right) который вызывается для сравнения if.

Так в Groovy, переключатель вообще дороже чем серийный если блоки.