Case vs If Else If: Quale è più efficiente?

Possibili duplicati:
è “else if” più veloce di “switch () case”?
Qual è la performance relativa di if / else vs. switch in Java?

Sono stato di nuovo in codice … quando il debugger passa attraverso un’istruzione case, salta all’elemento che corrisponde immediatamente alle condizioni, tuttavia quando viene specificata la stessa logica usando if / else che passa attraverso ogni istruzione if fino a quando non trova il vincitore. La dichiarazione del caso è più efficiente o il mio debugger sta semplicemente ottimizzando il passaggio? (non preoccuparti della syntax / 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{ } 

    Sembra che il compilatore stia meglio nell’ottimizzare una dichiarazione di commutazione piuttosto che un’istruzione if.

    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

    Il debugger lo rende più semplice, perché non si desidera passare attraverso il codice effettivo creato dal compilatore.

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

    Vedi la domanda strettamente correlata è “else if” più veloce di “switch () case”? .

    Ovviamente altre lingue oltre a C # la implementeranno in modo più o meno diverso, ma un passaggio è generalmente più efficiente.

    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 una tabella di diramazione indicizzata per ottimizzare le istruzioni di commutazione. Wikipedia ha una buona discussione dell’istruzione switch. Inoltre, ecco una discussione sull’ottimizzazione degli 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. Vedi qui per un esempio.

    Credo che i casi debbano essere valori costanti, l’istruzione switch fa l’equazione di un goto, quindi in base al valore della variabile salta al caso giusto, mentre nell’istruzione if / then deve valutare ogni espressione.

    può fare ciò per le istruzioni caso in quanto i valori sono costanti del compilatore. Una spiegazione più dettagliata è qui http://sequence-points.blogspot.com/2007/10/why-is-switch-statement-faster-than-if.html

    Penso che sia solo il debugger che lo rende semplice. Si noti che un caso e “se l’elenco” non sono in definitiva gli stessi. C’è una ragione per cui i blocchi del caso normalmente terminano con “pausa”. 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 hai l’interruzione, i blocchi del caso mancherebbero gli stacks “GOTO END”, e infatti se sei atterrato nel caso “auto” avresti effettivamente eseguito entrambe le sezioni

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

    La voce dell’istruzione Switch di Wikipedia è abbastanza grande e in realtà piuttosto buona. Punti interessanti:

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

    Per un’ottimizzazione strana e interessante usando un interruttore C, vedi Duff’s Device .