Perché l’istruzione switch e non if-else?

Mi sono chiesto questo da un po ‘di tempo. Di gran lunga non sono un programmatore hardcore, principalmente piccoli script Python e ho scritto un paio di simulazioni di dynamic molecolare. Per la vera domanda: qual è il punto dell’istruzione switch ? Perché non puoi semplicemente usare l’ istruzione if-else ?

Grazie per la tua risposta e se questo è stato chiesto prima di indicarmi il link.

MODIFICARE

S.Lott ha sottolineato che questo può essere un duplicato di domande If / Else vs. Switch . Se vuoi chiudere, fallo. Lo lascerò aperto per ulteriori discussioni.

    Un costrutto switch è più facilmente tradotto in una tabella di salto (o ramo) . Ciò può rendere le dichiarazioni di commutazione molto più efficienti di if-else quando le etichette dei casi sono ravvicinate. L’idea è di posizionare sequenzialmente una serie di istruzioni di salto in memoria e quindi aggiungere il valore al contatore del programma. Questo sostituisce una sequenza di istruzioni di confronto con un’operazione di aggiunta.

    Di seguito sono riportati alcuni esempi di assembly psuedo estremamente semplificati. Innanzitutto, la versione if-else:

    // C version if (1 == value) function1(); else if (2 == value) function2(); else if (3 == value) function3(); // assembly version compare value, 1 jump if zero label1 compare value, 2 jump if zero label2 compare value, 3 jump if zero label3 label1: call function1 label2: call function2 label3: call function3 

    La prossima è la versione dello switch:

      // C version switch (value) { case 1: function1(); break; case 2: function2(); break; case 3: function3(); break; } // assembly version add program_counter, value call function1 call function2 call function3 

    Puoi vedere che il codice di assemblaggio risultante è molto più compatto. Si noti che il valore dovrebbe essere trasformato in qualche modo per gestire altri valori di 1, 2 e 3. Tuttavia, questo dovrebbe illustrare il concetto.

    Switch può essere ottimizzato compilando r – otterrai codice più veloce.
    Inoltre trovo che sia più elegante quando si tratta di tipi enumerabili.

    Per riassumere l’istruzione switch ti offre prestazioni + codice eleganza 🙂

    Ecco alcuni link utili:

    • confronto di velocità di switch vs if / else in C #
    • Ottimizzazione della dichiarazione degli interruttori feedback-guidati (pdf che descrive l’ottimizzazione dell’istruzione switch)

    Per espressività, l’opzione interruttore / caso consente di raggruppare più casi insieme, ad esempio:

     case 1,2,3: do(this); break; case 4,5,6: do(that); break; 

    Per le prestazioni, i compilatori a volte possono ottimizzare le dichiarazioni di commutazione in tabelle di salto.

    Sto ignorando questo tipo di ottimizzazione a basso livello come di solito non importante, e probabilmente diverso dal compilatore al compilatore.

    Direi che la principale differenza è la leggibilità. se / else è molto flessibile, ma quando vedi un interruttore sai subito che tutti i test sono contro la stessa espressione.

    Oltre alla leggibilità e all’ottimizzazione del codice citate in .NET, si ottiene anche la possibilità di accendere enumerazioni ecc

     enum Color { Red, Green, Blue }; Color c = Color.Red; switch (c) // Switch on the enum { // no casting and no need to understand what int value it is case Color.Red: break; case Color.Green: break; case Color.Blue: break; } 

    La possibilità di cadere in diversi casi (lasciando intenzionalmente la frase break) può essere utile e, come alcune persone hanno già detto, è anche più veloce. Forse la considerazione più importante e meno importante è che rende il codice più carino di se / else. 🙂

    Switch può essere ottimizzato “Better” da alcuni compilatori. Ci sono delle insidie ​​nell’usare l’istruzione switch in alcune lingue. In Java, lo switch non può gestire le stringhe e in VB2005 l’istruzione switch non funzionerà con i pulsanti di opzione.
    Switch può essere più veloce e più facile da leggere, If-Then è più generico e funzionerà in più posti.

    Le uniche opzioni temporali possono essere più veloci quando i valori del caso sono costanti, non dinamici o derivati ​​in altro modo e quando il numero di casi è significativamente maggiore del tempo per calcolare un hash in una tabella di ricerca.

    Caso in questione per Javascript, che compila l’assembly per l’esecuzione sulla maggior parte dei motori, incluso il motore V8 di Chrome, è che le istruzioni switch sono più lente del 30% -60% da eseguire nel caso comune: http://jsperf.com/switch-if -else / 20