I condizionali nidificati hanno un impatto significativo sulle prestazioni? [duplicare]

3

Questa è una domanda che vive nella mia mente da molto tempo.

L'uso di più istruzioni condizionali nidificate influisce sulle prestazioni di un codice acquisito? Finora so che i programmatori hanno creato un termine preciso per descrivere questa situazione, la famosa "Piramide del destino" [Wikipedia pagina] , ma a parte questo quanto può degradare le prestazioni?

Consideriamo questa situazione come un esempio: ho un JSON proveniente da una risposta del server contenente alcuni oggetti che rappresentano gli acquisti dell'utente in un'applicazione, prima di prendere i dati necessari da esso ho bisogno di controllare varie condizioni:

  1. La risposta che stiamo cercando?
  2. La risposta ha resultCode: OK ?
  3. I contenuti da elaborare sono tutti?

A questo punto se tutto è true inizierà un "processo di elaborazione", analizzando e modificando la risposta del server, in questo caso per cambiare il formato della data dagli Stati Uniti al formato europeo standard. Il processo consiste in due% co_de nidificate e una for-loop .

Questo è il codice di esempio in if statement , dal momento che sono uno sviluppatore iOS:

if ([remoteManager.operationId isEqualToString:NEEDED_OPERATION_ID]) {
    if ([response[RESULT_CODE_KEY] isEqualToString:@"OK"]) {
        if ([response[RESULT_OBJ_KEY][@"CONTENT_LIST"] count] > 0) {
            NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init];

            for (NSMutableDictionary *productsAvailable in response[RESULT_OBJ_KEY][@"CONTENT_LIST"]) {
                for (NSString *key in productsAvailable) {
                    if ([key isEqualToString:@"NEEDED_KEY"]) {
                        /* We change the date format here */
                    }
                }
            }
        }
    }
}

A mio avviso questo codice non può davvero avere un impatto sulle prestazioni di un'applicazione perché tali controlli non sono così complicati da fare per il sistema. Ma questo può essere un problema se abbiamo bisogno di avere la massima velocità e le prestazioni? In altre parole: dovrebbero essere evitati condizionali nidificati o no? Inoltre, l'aggiunta di più condizioni contemporaneamente riduce i problemi di prestazioni (se presenti)?

    
posta Aluminum 07.10.2015 - 17:10
fonte

2 risposte

7

La sequenza di passaggi che hai descritto sembra essere una sequenza di passaggi che devi eseguire, in modo che la tua applicazione possa ottenere ciò che dovrebbe raggiungere. Quindi, non c'è nulla che potresti aggiungere o rimuovere.

Con il codice esistente, hai le seguenti opzioni:

  • Riorganizza l'ordine in cui vengono valutati i condizionali. Potresti, forse, ottenere prestazioni migliori riorganizzando i condizionali in modo che vengano valutati per primi quelli che si verificano più frequentemente, o così che i più computazionalmente costosi vengono valutati per ultimi, ma non ne vale la pena, e in ogni caso devi passare un po 'di tempo a misurare cose prima di tentare di farlo, altrimenti stai risolvendo il problema e correndo il rischio di peggiorare le cose invece di migliorare le cose.

  • Sostituisci il nesting con più espressioni ANDed insieme. Non so nulla di Objective-C, ma sarei disposto a scommettere che rimanga fedele alla tradizione di C, e usa short -circuito valutazione di espressione booleana, quindi il costrutto if(a) { if(b) { ... } } equivale a if((a) && (b)) { ... } , quindi l'annidamento o l'annidamento non fanno assolutamente alcuna differenza.

  • Sostituisci l'annidamento con l'uscita anticipata. L'uscita anticipata è quando dici if(!a) return; if(!b) return; bulk-of-code-goes-here. Ci sono persone che insistono per uscire presto, in modo da ridurre il nidificazione e altri che non vedono problema con la nidificazione, e credere che l'uscita anticipata sia cattiva. Ma ancora una volta, questo non fa differenza sulla velocità di esecuzione del codice, quindi questo problema riguarda lo stile, non le prestazioni: "annidare o non annidare" è una domanda interamente soggettiva che può ricevere solo una risposta soggettiva. (Che è, naturalmente, "muori, fai il nido!" )

Quindi, non c'è praticamente nulla che tu possa fare per migliorare le cose, e l'annidamento o nessuna nidificazione non ha assolutamente alcun impatto sulle prestazioni. Oltre a ciò, indipendentemente dal modo in cui strutturate i vostri condizionali, il compilatore è generalmente libero di emettere il codice macchina nel modo che ritiene opportuno, purché abbia lo stesso risultato, quindi i condizionali nidificati verranno probabilmente implementati come uscite anticipate dal compilatore, proprio come farebbe la valutazione del cortocircuito. Ciò significa che alla fine della giornata, l'unico criterio su come organizzare i tuoi condizionali dovrebbe essere come è più naturale per te leggerli e comprenderli.

Ti raccomando di dare ascolto al consiglio contenuto nell'eccellente (e ironico) suggerimento di gnat che la tua domanda è un duplicato di un'altra domanda che è in realtà relativa alle micro-ottimizzazioni: smetti di preoccuparti delle prestazioni del codice. Dovresti iniziare a preoccuparti solo delle prestazioni se il tuo prodotto finale è effettivamente in grado di sopportare le prestazioni, e anche allora le soluzioni che troverai saranno probabilmente algoritmiche, ottimizzazioni per immagini grandi, ed è altamente improbabile che abbiano qualcosa a che fare con il modo in cui ordini le singole istruzioni.

    
risposta data 07.10.2015 - 21:29
fonte
7

Il problema con le condizioni nidificate non è la velocità, la sua comprensione umana.

Gli esseri umani hanno difficoltà a far fronte a molte possibilità contemporaneamente. Raggiungono il loro limite (che è abbastanza piccolo), quindi iniziano a commettere errori senza rendersene conto.

Le istruzioni condizionali aumentano la complessità abbastanza rapidamente: 2, 4, 8, 16, 32, 64, 128 ... e per quasi tutti i programmatori, il limite è a cifre singole.

I computer non hanno problemi nell'ottimizzare il codice con moltissime condizioni nidificate, ma gli umani troveranno quasi impossibile mantenere il codice sorgente - il che significa che non funzionerà.

La maggior parte delle tecniche di programmazione riguarda il far fronte alla debolezza umana piuttosto che alla velocità. Il codice sorgente è per gli esseri umani.

    
risposta data 07.10.2015 - 18:19
fonte