2012-08-24 14 views
7

So che in Java il interruttore dichiarazione non deve essere usato quando si hanno pochi casi, e in questo caso è meglio utilizzare un if else if.groove 'interruttore' vs 'se' le prestazioni

È vero anche per Groovy?

Quale è più performante tra questi due codici?

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

o:

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

È una preoccupazione reale o solo una curiosità? È improbabile che questo sarebbe il collo di bottiglia delle prestazioni ovunque in un'applicazione reale. Se sei davvero curioso, perché non esegui alcuni test e scopri? –

+0

Era solo la curiosità di sapere cosa succede all'interno della JVM quando utilizzo lo _switch_ – rascio

risposta

13

In Java, "switch" è più effient di seriale se blocca perché il compilatore genera un'istruzione tableswitch cui il bersaglio può essere determinata da una tabella salto.

In Groovy, switch non è limitato ai valori interi e ha un sacco di semantica aggiuntiva, quindi il compilatore non può utilizzare tale funzionalità. Il compilatore genera una serie di confronti, proprio come farebbe per i blocchi seriali.

Tuttavia, viene chiamato per ogni confronto ScriptBytecodeAdapter.isCase(switchValue, caseExpression). Questa è sempre una chiamata di metodo dinamica a un metodo isCase sull'oggetto caseExpression. Quella chiamata è potenzialmente più costosa di ScriptBytecodeAdapter.compareEqual(left, right) che viene chiamata per un confronto se.

Quindi, in Groovy, lo switch è generalmente più costoso di seriale se blocchi.

+1

Per curiosità, sai quali modifiche su questo in Groovy 2.0 usi la compilazione statica? – cdeszaq

+0

Interessante domanda, l'ho appena controllato. Come mi aspettavo, non cambia le chiamate in ScriptBytecodeAdapter. Quindi, anche se @CompileStatic forza le invocazioni del metodo statico nel metodo selezionato, "switch" e "if" eseguono ancora chiamate di metodo dinamiche tramite ScriptBytecodeAdapter. –

+0

Mi chiedo se questo non è un luogo per l'ottimizzazione della velocità possibile? – cdeszaq