2010-01-28 18 views
52

Possibili duplicati:
is “else if” faster than “switch() case” ?
What is the relative performance of if/else vs. switch in Java?Case vs If Else If: Quale è più efficiente?

Ive codifica-in-the-run di nuovo .... quando il debugger, attraverso una dichiarazione caso si salta alla voce che soddisfa immediatamente le condizioni, tuttavia quando viene specificata la stessa logica usando/se passa attraverso ogni istruzione if finché non trova il vincitore. La dichiarazione del caso è più efficiente o il mio debugger sta semplicemente ottimizzando il passaggio? (non preoccuparti della sintassi/errori, ho inserito questo in SO, non so se verrà compilato, è il principio che sto cercando, non volevo farlo come ints perchè ricordo vagamente qualcosa riguardo caso utilizzando un offset con ints) Io uso C#, ma mi interessa una risposta generale attraverso i linguaggi di programmazione.

switch(myObject.GetType()){ 

    case typeof(Car): 
     //do something 
     break; 

    case typeof(Bike): 
     //do something 
     break; 

    case typeof(Unicycle): 
     //do something 
     break; 

    case default: 
     break; 
} 

VS

Type myType = myObject.GetType(); 

    if (myType == typeof(Car)){ 
      //do something 
    } 

    else if (myType == typeof(Bike)){ 
      //do something 
    } 

    else if (myType == typeof(Unicycle)){ 
      //do something 
    } 
    else{ 

    } 
+8

Questo non è nemmeno * vicino * all'ignoraggio della lingua, qualsiasi risposta sarà strettamente legata a una lingua specifica. – skaffman

+3

per non parlare della versione specifica del compilatore e del compilatore. –

+0

Può variare tra lingue, compilatori e runtime. Non c'è modo di saperlo con certezza. – FrustratedWithFormsDesigner

risposta

69

Sembra che il compilatore è meglio per ottimizzare uno switch-statement che un se-dichiarazione.

Il compilatore non sa se l'ordine di valutazione delle istruzioni if ​​è importante per te e non può eseguire alcuna ottimizzazione lì. Potresti chiamare i metodi nelle istruzioni if, influenzando le variabili. Con l'istruzione switch, sa che tutte le clausole possono essere valutate contemporaneamente e possono metterle nell'ordine che è più efficiente.

Ecco un piccolo confronto:
http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx

+1

Non capisco questa parte "Potresti chiamare i metodi nelle istruzioni if, influenzando le variabili" Come potrebbe accadere in un if? Penso che sia lo stesso. – Castelmager

+0

Si può fare se (++ i) {....}, ma non è possibile farlo in un'istruzione switch case. – Granada

0

credo che sia solo il debugger che rende semplice. Si noti che un caso e "se l'elenco" non sono in definitiva gli stessi. C'è un motivo per cui il blocco dei casi normalmente termina con "interruzione". Il caso stmt in realtà è simile a questo quando viene suddiviso in assembly.

if myObject.GetType() == type of Car 
    GOTO START_CAR 
else if myObject.GetType() == type of Bike 
    GOTO START_BIKE 

LABEL START_CAR 
//do something car  
GOTO END 

LABEL START_BIKE 
//do something bike 
GOTO END 

LABEL END 

Se non avete la pausa, poi i blocchi caso sarebbe saltato le stmts "GOTO END", e in effetti, se è atterrato nel caso "auto" si sarebbero effettivamente eseguito entrambe le sezioni

//do something car  
//do something bike 
GOTO END 
0

credo perché i casi devono essere valori costanti, l'istruzione switch fa l'equivelent di un goto, quindi in base al valore della variabile salta al caso giusto, mentre nel if/then dichiarazione deve valutare ogni espressione

7

Il debugger sta rendendo più semplice, perché non si vuole fare un passo attraverso il codice che il compilatore crea.

Se lo switch contiene più di cinque elementi, è implementato utilizzando una tabella di ricerca o una tabella hash, altrimenti è implementato utilizzando un if..else.

Vedere la domanda strettamente correlata is “else if” faster than “switch() case” ?.

Altre lingue oltre a C# lo implementeranno in modo più o meno diverso, ma un interruttore è generalmente più efficiente.

5

Molti linguaggi di programmazione ottimizzano l'istruzione switch in modo che sia molto più veloce di uno standard if-else se la struttura prevede che i casi siano costanti del compilatore. Molte lingue utilizzano una tabella di salto o indicizzate branch table per ottimizzare le istruzioni di commutazione. Wikipedia ha una buona discussione dell'istruzione switch. Inoltre, here è una discussione sull'ottimizzazione dello switch in C.

Una cosa da notare è che le istruzioni switch possono essere abusate e, a seconda dei casi, potrebbe essere preferibile utilizzare il polimorfismo invece delle istruzioni switch. Vedere here per un esempio.

0

di Wikipedia Switch statement entry è piuttosto grande e in realtà piuttosto buono. Punti interessanti:

  • Gli interruttori non sono intrinsecamente veloci. Dipende dalla lingua, dal compilatore e dall'uso specifico.
  • Un compilatore può ottimizzare gli switch utilizzando tabelle di salto o puntatori di funzione indicizzati.
  • La dichiarazione è stata ispirata da alcuni interessanti calcoli dal Stephen Kleene (e altri).

Per un'ottimizzazione strana e interessante utilizzando un interruttore C, vedere Duff's Device.