come creare una nuova "Istruzione condizionale personalizzata" nel linguaggio di programmazione

2

È possibile creare una nuova "Istruzione condizionale personalizzata" in java.

Qui sto pensando di creare un nuovo componente personalizzato per l'istruzione switch per offrire prestazioni migliori. Il controllo Switch personalizzato che sto pianificando di creare avrà solo operatori interi: esempio:

int i = SOMEVALUE;
Switch(i)
{
Case 1: 
//Some Statement
Break;
Case 2: 
//Some Statement
Break;
Case 3: 
//Some Statement
Break;
....
....
....
Case 10000000: 
//Some Statement
Break;
Default:
//Some Statement
Break;
}

Secondo la mia conoscenza, la condizione di Switch controllerà un particolare ordine. Se il valore effettivo della variabile "i" è 9999999, allora deve controllare il caso per 9999999 volte ma se lo controlliamo con alcuni algoritmi simili alla ricerca binaria, le sue prestazioni saranno migliorate. Ho ragione ??

Se è giusto allora perché non aggiungiamo questa funzionalità al nostro linguaggio di programmazione? Quindi, perché non creiamo un "Custom Conditional Statement", qualcosa come "OrderedIntegerSwitch statement", in cui il valore passato all'interno di quell'interruttore dovrebbe essere un intero.

    
posta Dinesh Kumar 06.09.2011 - 08:31
fonte

4 risposte

5

In base alla specifica JVM , a L'istruzione switch può essere compilata nelle istruzioni bytecode tableswitch o lookupswitch , a seconda che i casi di switch siano sparsi.

tableswitch è O (1), mentre lookupswitch sembra essere O (log n) (suppongo che usi una ricerca binaria)

Se sei curioso di sapere quale istruzione viene scelta dal tuo compilatore per la tua porzione di codice, decompila il bytecode e vedi se trovi un'istruzione l'altra.

    
risposta data 06.09.2011 - 10:34
fonte
7

Non hai davvero ragione. Un'istruzione switch non è in genere implementata come una serie di if / elseif, ma con una tabella di salto, quindi viene già eseguita in un tempo costante, non in un tempo lineare. (Questo è il motivo per cui molte lingue già vincolano l'argomento a switch su un tipo integrale più piccolo di quanto teoricamente possibile.)

Per essere sicuri, nessun compilatore genererà una tabella di salto con 1000000 voci se si passa a qualcosa di così grande, ma ci sono trucchi simili per ottenere prestazioni O (1) anche se l'approccio ingenuo userebbe troppo spazio. I compilatori moderni usano quasi sempre alcuni di questi. Pertanto è improbabile che tu possa battere il tuo implementatore linguistico con una soluzione homebrew.

    
risposta data 06.09.2011 - 09:09
fonte
5

Oltre al fatto che i compilatori sono già intelligenti, hai davvero intenzione di digitare dieci milioni di casi di switch e le relative dieci milioni di istruzioni associate, e quindi hackerare un compilatore per l'ottimizzazione di tutto questo?

Faresti meglio a sforzarti nel cambiare il tuo design. Non riesco a immaginare una situazione di vita reale in cui hai bisogno di dieci milioni di azioni abbastanza diverse da non essere ridimensionate.

    
risposta data 06.09.2011 - 09:24
fonte
1

Correggimi se ho torto, ma per quanto ne so la grande differenza tra le dichiarazioni if..else e le switch , è che il primo controllerà per ogni caso uno per uno, finché non troverà quello corrisponde.

Con un interruttore, seguito da un'interruzione, salterai immediatamente al caso giusto e terminerai l'istruzione in seguito.

Penso che quello che dici sia vero per l'istruzione if..else , ma non per switch , che dovrebbe essere sempre più veloce con una grande quantità di casi da controllare.

    
risposta data 06.09.2011 - 09:23
fonte

Leggi altre domande sui tag