2012-08-24 27 views
7

Ich weiß, dass in Java die Schalter Anweisung sollte nicht verwendet werden, wenn Sie wenige Fälle haben, und in diesem Fall ist es besser ein if else if verwenden.groovy 'Switch' vs. 'if' Leistung

Stimmt das auch für groovy?

Welche ist leistungsstärker zwischen diesen beiden Codes?

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

oder:

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

Ist das ein echtes Problem oder nur eine Kuriosität? Es ist unwahrscheinlich, dass dies der Leistungsengpass irgendwo in einer realen Anwendung wäre. Wenn Sie wirklich neugierig sind, warum führen Sie nicht einfach ein paar Tests durch und finden es heraus? –

+0

Es war nur Neugier zu wissen, was passiert in der JVM, wenn ich den _switch_ – rascio

Antwort

13

In Java, "Switch" ist mehr als effient seriellen wenn Blöcke, weil der Compiler eine Instruktion tableswitch erzeugt, wo das Ziel aus einer Sprungtabelle bestimmt werden.

In Groovy ist switch nicht auf Integer-Werte beschränkt und hat viele zusätzliche Semantiken, so dass der Compiler diese Möglichkeit nicht nutzen kann. Der Compiler generiert eine Reihe von Vergleichen, genau wie es bei seriellen if-Blöcken der Fall wäre.

Für jeden Vergleich wird jedoch ScriptBytecodeAdapter.isCase(switchValue, caseExpression) aufgerufen. Dies ist immer ein dynamischer Methodenaufruf an eine isCase-Methode für das caseExpression-Objekt. Dieser Aufruf ist möglicherweise teurer als ScriptBytecodeAdapter.compareEqual(left, right), der für einen if-Vergleich aufgerufen wird.

Also in Groovy, Schalter ist in der Regel teurer als serielle wenn Blöcke.

+1

Aus Neugier, wissen Sie, was ändert sich in Groovy 2.0 mit statischen Kompilierung? – cdeszaq

+0

Interessante Frage, ich habe es gerade überprüft. Wie ich erwartet habe, ändert es nicht die Aufrufe in ScriptBytecodeAdapter. Obwohl @CompileStatic statische Methodenaufrufe in der ausgewählten Methode erzwingt, ziehen "switch" und "if" dennoch dynamische Methodenaufrufe über ScriptBytecodeAdapter. –

+0

Ich frage mich, ob dies nicht ein Ort für mögliche Geschwindigkeitsoptimierung ist? – cdeszaq