2010-08-02 19 views
9

Możliwe duplikaty:
Is "else if" faster than "switch() case"?
What is the relative performance difference of if/else versus switch statement in Java?case-statement lub if-oświadczenie perspektywa efektywności

wiem, że stwierdzenia przypadków mogą być realizowane ze stołami skoku. Czy to czyni je bardziej wydajnymi niż wyciągi?

Czy to tylko mikrooptymalizacja, której należy unikać?

+2

Dupe od [Czy „else if” szybciej niż „przełącznik() case "?" (http://stackoverflow.com/questions/767821/is-else-if-faster-than-switch-case), [Jaka jest względna różnica wydajności instrukcji if/else versus switch w Javie?] (http://stackoverflow.com/questions/2086529/what-is-the-relative-performance-difference-of-if-else-versus-switch-statement-in), [If vs. Switch Speed] (http://stackoverflow.com/questions/445067/if-vs-switch-speed), itp. – BalusC

+0

To nie jest dup, ponieważ to pytanie jest specyficzne dla java. – sixtyfootersdude

+1

Właściwie masz rację. To jest dupę http://stackoverflow.com/questions/2086529/what-is-relative-performance-difference-of-if-else-versus-switch-statement-in. Nie jest to jednak dupą innych, ponieważ nie są specyficzne dla java. Irytujące, jak efektywność i wydajność to różne tagi. – sixtyfootersdude

Odpowiedz

35

Myślę, że najważniejsze jest, aby napisać kod tak jasno, jak to możliwe. Mikro-optymalizacje takie jak ta nie powinny być w centrum zainteresowania.

Na przykład, jeśli masz coś takiego:

if (age == 10) { 
    // ... 
} else if (age == 20) { 
    // ... 
} else if (age == 30) { 
    // ... 
} else if (age == 40) { 
    // ... 
} 

Wtedy to wyraźniej użyć instrukcji switch:

switch (age) { 
    case 10: 
     // ... 
     break; 
    case 20: 
     // ... 
     break; 
    case 30: 
     // ... 
     break; 
    case 40: 
     // ... 
     break; 
} 

Ponownie, chciałbym skupić się na tworzeniu kodu najłatwiej raczej odczytywać i utrzymywać, a nie nano-drugi poziom wydajności.

0
  1. Tak
  2. Nie, to jest częścią projektu programu. Ale powinieneś rozważyć, czy nadmiarowa metoda może nie być jeszcze lepszym rozwiązaniem, z rodziną typów.
2

Jeśli miałbyś bardzo duży łańcuch łańcuchów instrukcji else, to tak, możesz poczuć różnicę. Ale to bardzo nierealne, że kiedykolwiek napiszesz taki długi łańcuch ifelse. A nawet gdybyś tak zrobił, to jest bardzo mało prawdopodobne, że to właśnie tam pojawi się twoje wąskie gardło wydajności.

Napisz kod, który będzie czytelny jako pierwszy, i poprowadź się przez profilera, gdy pojawi się potrzeba optymalizacji wydajności.

3

Każdy kompilator tworzy tabelę przeskoków, jeśli może sprawdzić, czy wartości są względnie zwarte. (Wątpię, czy są w tym przypadku wielokrotnością 10.)

To jest mikrooptymalizacja. Mikro-optymalizacja ma sens tylko wtedy, gdy wiesz, że tak. Zwykle istnieją większe "ryby do smażenia" w innym miejscu, w postaci wywołań funkcji, które można by wykonać bez. Jednakże, jeśli już dostroiłeś światła dzienne z tego kodu, a twoje profilowanie pokazuje, że znaczna część (np. 10% lub więcej) czasu trafia do tych instrukcji IF (a nie do ich zawartości) to pomaga. Może się tak zdarzyć na przykład w tłumaczeniu kodu bajtowego.

Dodano: Innym powodem, dla którego lubię używać switch, jest to, nawet jeśli nie tworzy ona tabeli przeskakiwania - podczas przechodzenia przez kod w debugerze przechodzi bezpośrednio do właściwego przypadku, zamiast przeprowadzania mnie przez wiele fałszywych oświadczeń if. Ułatwia debugowanie.

1

Prawdopodobnie nie ma znaczenia. Bytecode to po prostu "format transportu" dla JVM. Co dzieje się na miejscu JVM bardzo różni się od reprezentacji kodu bajtowego.(Przykład: kod bajtowy nie oferuje operacji float, więc float + - * /% float jest wykonywany jako podwójne operacje, a następnie wynik jest rzutowany z powrotem na float. To samo dotyczy bajtu/skrótu, są one konwertowane na int, a następnie z powrotem .) Ale dla przełącznika są to dwa formaty bajtowe, jeden już z tabelą skoku. Ale szczerze: wybrałbym format, który jest najlepszy dla ciebie i dla czytelnika twojego programu. JVM zrobi resztę. Jeśli jesteś zbyt mądry, JVM może nie zrozumie twojego punktu, a na końcu program jest wolniejszy.

„Powinniśmy zapomnieć o małej wydajności, powiedzmy około 97% czasu: przedwczesny optymalizacji jest korzeniem wszelkiego zła” D. Knuth