Domanda

Sto lavorando a un progetto che richiede l'elaborazione JavaScript piuttosto complessa. Ciò include molti nidificati se - else in parecchi posti. In genere mi sono occupato di ottimizzare il codice JavaScript il più possibile leggendo gli altri suggerimenti su Stack & nbsp; Overflow, ma mi chiedo se i seguenti due costrutti farebbero alcuna differenza in termini di velocità da soli:

if(some_condition) {
    // process
    return ;
}

// Continue the else condition here

vs

if(some_condition) {
    // Process
}

else {
   // The 'else' condition...
}
È stato utile?

Soluzione

Vado sempre con il primo metodo. Più facile da leggere e meno rientro. Per quanto riguarda la velocità di esecuzione, questo dipenderà dall'implementazione, ma mi aspetto che entrambi siano identici.

Altri suggerimenti

In molte lingue, è una pratica comune invertire if dichiarazioni per ridurre la nidificazione o utilizzare precondizioni .

E avere meno annidamenti nel codice migliora la leggibilità e la manutenibilità del codice.

" Profile, non speculare! "

  1. stai mettendo il carro davanti al cavallo (la manutenibilità da parte degli umani supera la velocità della macchina)
  2. dovresti guidare i tuoi sforzi di ottimizzazione mediante misurazioni , che significa

    • dovresti cronometrare l'esecuzione tu stesso; ovviamente differirà in diversi browser e versioni
    • dovresti ottimizzare solo per la velocità hotspot della tua applicazione (vedi punto 1)

Non ci sarà alcuna differenza nelle prestazioni, consiglierei il secondo esempio di manutenibilità. In generale è buona norma disporre di un solo e possibile punto di uscita per una routine. Aiuta il debug e la comprensione.

Userò il primo approccio per escludere situazioni non valide.

Eg. utilizzare il primo approccio quando si eseguono alcune convalide e restituire se una delle convalide fallisce. Non ha senso andare oltre se una delle condizioni preliminari fallisce. La stessa cosa è menzionata da Martin Fowler nel suo Refactoring . Lo chiama "Sostituzione delle condizioni con clausole della Guardia". E può davvero rendere il codice facile da capire.

Ecco un esempio di Java.

  public void debitAccount(Account account, BigDecimal amount) {
    if(account.user == getCurrentUser()) {
      if(account.balance > amount) {
           account.balance = account.balance - amount
       } else {
          //return or throw exception
       }
    } else {
        //return or throw exception
    }
  }

VS

 public void debitAccount(Account account, BigDecimal amount) {
    if(account.user != getCurrentUser()) return //or error
    if(account.balance < amount) return //or error
    account.balance = account.balance - amount    
}

Forse leggermente, ma non credo che sarà misurabile a meno che il resto della funzione non implichi "pesante". (e altrimenti ridondante poiché presumo che un ritorno darebbe lo stesso risultato) js chiama.

Come nota a margine, penso che questa non sia una micro ottimizzazione non necessaria e dovresti probabilmente cercare altrove miglioramenti delle prestazioni, ad esempio profilare lo script tramite gli strumenti di sviluppo di Chrome o Firebug per Firefox (o strumenti simili) e cercare un funzionamento lento / lungo chiamate / funzioni.

Sebbene dipenda dall'implementazione JavaScript del browser in esecuzione, non dovrebbe esserci alcuna differenza notevole tra loro (in termini di velocità).

La seconda forma è preferibile poiché interrompere il flusso non è una buona abitudine di programmazione. Pensa anche a quello nell'assemblaggio, l'istruzione di salto (micro operazione) viene sempre valutata indipendentemente dalla valutazione.

Provalo tu stesso. Se questo JavaScript viene eseguito nel browser, dipenderà quasi sicuramente dal motore di analisi JavaScript del browser.

La mia comprensione è che non farebbe differenza perché si ramifica con la condizione if. Quindi, se some_condition è vero, la parte else non verrà toccata, anche senza il ritorno.

Supponi che il return impieghi 1ms contro il nidificato se impiega 0.1ms (o viceversa).

È difficile immaginare che uno dei due sia così lento.

Ora, lo stai facendo più di 100 volte al secondo?

In tal caso, forse dovresti preoccuparti.

Quando esiste un solo if..else le prestazioni sono quasi le stesse e non importa. Usa tutto ciò che è meglio leggibile nel tuo caso. Ma venire alle dichiarazioni nidificate usando return è il più performant rispetto a if ... else e case switch

Parlando delle mie esperienze dipende dalla condizione che stai verificando.

  1. if .. return va bene e facile da leggere se controlli qualche condizione booleana (forse impostazione) che renderebbe inutile eseguire l'intero codice seguente.

  2. if .. else è molto più semplice da leggere se si prevede che un valore sia uno dei due (o più) valori possibili e si desidera eseguire codice diverso per entrambi i casi. Ciò significa che i due valori possibili rappresentano condizioni di uguale valore interpretabile e devono quindi essere scritti sullo stesso livello logico.

A mio avviso, return e else sono gli stessi per il caso precedente, ma in generale if-else e if () return; sono molto diversi. È possibile utilizzare l'istruzione return quando si desidera passare dall'ambito attuale all'ambito padre mentre in caso di if-else è possibile verificare ulteriori if-else nello stesso ambito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top