2012-01-26 19 views
15

Confronta:costo di chiamare una funzione o non in Javascript

if (myVariable) { 
    doSomething() 
} 

function doSomething() 
{ 
    // Work goes here 
} 

vs

doSomething(); 

function doSomething() 
{ 
    if (myVariable) { 
     // Work goes here 
    } 
} 

cioè mia domanda è se è più veloce per fare la verifica al di fuori della funzione e di evitare un cambio di contesto (Penso che sia il termine giusto) o lo fai semplicemente all'interno della funzione perché fa una differenza così piccola?

Cheers.

+0

Grande domanda! Se myVariable non è sempre disponibile, il secondo esempio funzionerà solo se si assegna la variabile come argomento alla funzione, non so se sia saggio. D'altra parte si prevengono alcuni errori. A mio parere: se myVariable deve essere sempre true per eseguire la funzione, utilizzare l'esempio due. Se è opzionale, usa uno esempio. – Tim

+0

Se stai chiedendo il costo di chiamare una funzione, allora sì, c'è qualche costo, ma quanto dipenderà dall'implementazione di JavaScript. C'è meno costo nelle implementazioni più recenti, ma il costo è ancora lì. –

+1

Prenditi cura dei chili e dei penny che si prenderanno cura di loro stessi :-) – spraff

risposta

11

It Just Doesn't Matter (anche se il primo metodo evita alcuni lavoro così dovrebbe veloce, ma di una quantità che è probabilmente meno rumore statistico).

Ciò che conta davvero è quale metodo rappresenti la logica. La regola generale è che ogni affermazione in una funzione dovrebbe essere sullo stesso livello di astrazione. L'espressione condizionale è più o meno astratta della chiamata di funzione?

+1

Comprendo e concordo con il punto che non ha importanza. Ma questa domanda ha una risposta corretta e "Semplicemente non importa" non è la risposta corretta. Vorrei che la tua risposta indicasse chiaramente la risposta corretta e usassi il punto "non importa" come un ripensamento. In realtà non importa nel 99,99% dei casi, ma se si sta tentando di creare un server Web Node in grado di gestire milioni di richieste al secondo, probabilmente sarebbe importante in una certa misura. –

+1

Se gestisci milioni di richieste al secondo, questo non è il collo di bottiglia. La risposta corretta è "seguire le regole del miglior design, non le regole della migliore ottimizzazione". – spraff

1

Trovo che il secondo metodo renda il codice più manutenibile e leggibile. Ciò comporta pochissimo overhead.

+1

Forse, forse no. Dipende dalle circostanze, no? – spraff

1

Sarebbe più veloce farlo all'esterno perché effettuare una chiamata di funzione ogni volta sarà leggermente più lento del primo controllo e quindi della chiamata della funzione.

Ma perché preoccuparsi? Nessuno noterà una chiamata di funzione rispetto a ciò che sta effettivamente facendo la chiamata di funzione. I selettori DOM inefficienti che fanno sì che il tuo codice debba cacciare e beccare attraverso un'enorme struttura ad albero per alcuni aghi nel pagliaio rappresentano una minaccia molto più grande per le prestazioni.

+0

Un piccolo contesto: Normalmente sono d'accordo che è una differenza davvero minuscola che normalmente non vale la pena preoccuparsi, ma il codice è una libreria che altre persone useranno, quindi non ha davvero bisogno di essere un collo di bottiglia. – Richard

+0

In realtà, dimenticalo. Ho appena letto l'articolo e in sintesi: mi preoccupo per nada. – Richard

1

È trascurabile; le differenze nelle prestazioni sono minime e i browser sembrano gestirlo in modo diverso:

Modifica: Esiste davvero una differenza nelle prestazioni: la maggior parte dei browser esegue il Metodo 1 leggermente più veloce.

//Method 1: 

var t1 = Date.now(); 

myVariable = true; 

for(var i = 0; i < 20000000; i++) { 



    function doSomething() 
    { 
     Math.sin(Math.cos(0)); 
    } 

    if (myVariable) { 
     doSomething() 
    } 

    myVariable = !myVariable; 
} 

console.log(Date.now() - t1); 







//Method 2: 

var t1 = Date.now(); 

myVariable = true; 

for(var i = 0; i < 20000000; i++) { 

    function doSomething() 
    { 
     if (myVariable) { 
      Math.sin(Math.cos(0)); 
     } 
    } 


    doSomething(); 

    myVariable = !myVariable; 

} 

console.log(Date.now() - t1); 





//Results: 
//Safari: About the same, former was slightly quicker 
//Firefox: Former was quicker 
//Chrome: About the same, latter was somewhat quicker 
//Opera: Executed the former quicker 
+1

Il tuo 'myVariable' è sempre' true', quindi non stai veramente misurando il costo di chiamare una funzione (perché è sempre chiamata). –

+0

Modifica: hai ragione, c'è una differenza, la aggiornerò. –

+0

Il tuo test è scadente perché stai costringendo il povero interprete a _recreare_ la stessa funzione più e più volte. Quindi stai misurando il sovraccarico della funzione _creation_, non la funzione _invocation_. – Alnitak

Problemi correlati