Per una funzione come questa:
function threeArgs(x, y, z) {
return x + y + z;
}
che si chiama in questo modo:
threeArgs(1, 2, 3);
l'ottimizzatore è libero di fare la scelta di generare alcun codice a tutti. È abbastanza facile per esso determinare che non ci sono effetti collaterali, perché la funzione fa semplicemente riferimento ai suoi valori di parametro e restituisce il risultato di un'espressione semplice. Poiché il valore di ritorno è ignorato, non c'è motivo per il runtime di fare qualsiasi cosa.
Oltre a ciò, se il codice fosse:
something += threeArgs(1, 2, 3);
l'ottimizzatore potrebbe decidere di generare il codice più o meno equivalente a:
something += 6;
Perché? Perché la chiamata è stata effettuata con costanti numeriche e può tranquillamente piegare quelle al momento della generazione del codice. Potrebbe essere prudente, perché i numeri sono strani, ma qui sono tutti interi, quindi potrebbe benissimo farlo. Anche se così non fosse, si potrebbe tranquillamente inline la funzione:
something += 1 + 2 + 3;
Quando c'è un parametro mancante, tuttavia, può essere che l'ottimizzatori bail out e generare una vera e propria chiamata di funzione. Per una funzione così semplice, il sovraccarico della chiamata di funzione potrebbe facilmente spiegare una grande differenza di prestazioni.
Utilizzando le variabili anziché le costanti in un test e utilizzando effettivamente il valore restituito della funzione, è possibile "confondere" l'ottimizzatore e impedirgli di saltare la chiamata o pre-calcolare il risultato, ma si può t tenerlo da inlining. Continuo a pensare che il tuo risultato sia interessante per questo motivo: espone il fatto che (ad oggi comunque) quegli ottimizzatori sono sensibili al modo in cui vengono invocate le funzioni.
@MattWhipple - Questo è un post interessante, ma cosa ha a che fare con la domanda dell'OP? (Bella domanda, a proposito, @robC.) –
Questa è una scoperta interessante.Prima di cambiare tutto il codice per riempire tutti gli argomenti, verificherei se esiste una segnalazione di bug aperta per quelle implementazioni JS e, se non la prima. –
Sospetto fortemente che il runtime stia integrando le funzioni quando c'è un conteggio dei parametri, ma eseguendo la funzione come una chiamata di funzione effettiva altrimenti. Il fatto che nulla faccia alcun uso del valore restituito dalla funzione può significare che il runtime non fa assolutamente nulla * quando i parametri sono completamente forniti. – Pointy