Console.log ridurrà le prestazioni di esecuzione di JavaScript?


99

L'uso della funzionalità di debug console.logridurrà le prestazioni di esecuzione di JavaScript? Influirà sulla velocità di esecuzione degli script negli ambienti di produzione?

Esiste un approccio per disabilitare i log della console negli ambienti di produzione da un unico percorso di configurazione?


Tutte le risposte, finora, presumono che tu stia semplicemente emettendo messaggi di stringa. E le prestazioni degli oggetti di registrazione, con strutture di oggetti di grandi dimensioni? es. console.log (largeObj)?
PandaWood

L'output di un numero significativo di oggetti alla console può trasformare il caricamento di una pagina di 3 secondi in 30 secondi. Solo un esempio ...
Andrew

Un semplice console.logprende ~
50 ms

Risposte:


55

Se hai intenzione di avere questo su un sito pubblico o qualcosa del genere, chiunque abbia poca conoscenza sull'uso degli strumenti per sviluppatori può leggere i tuoi messaggi di debug. A seconda di ciò che stai registrando, questo potrebbe non essere un comportamento desiderabile.

Uno degli approcci migliori è racchiudere il console.login uno dei tuoi metodi e dove puoi controllare le condizioni ed eseguirlo. In una build di produzione, puoi evitare di avere queste funzioni. Questa domanda su Stack Overflow parla in dettaglio di come fare lo stesso usando il compilatore Closure .

Quindi, per rispondere alle tue domande:

  1. Sì, ridurrà la velocità, anche se solo in modo trascurabile.
  2. Ma non usarlo perché è troppo facile per una persona leggere i tuoi registri.
  3. Le risposte a questa domanda possono darti suggerimenti su come rimuoverli dalla produzione.

grazie ma ancora avvolgendo il conosle.logsarà ancora un colpo alla funzione sovrascritta non è vero?
Sudantha

15
Solo una nota: l'utilizzo console.logper registrare gli oggetti causa perdite di memoria poiché il browser conserva la struttura degli oggetti per consentire agli sviluppatori di espandere il registro.
Shamasis Bhattacharya


8
"è troppo facile per una persona leggere i tuoi log" - In che modo è un problema? È JavaScript, hanno già pieno accesso al codice sorgente!
Quentin

4
Giusto per intervenire: ho appena scoperto che inviare spam al console.log anche con lo stesso testo statico (nessun oggetto o array; letteralmente solo console.log ('test') lo farebbe) provoca anche un calo delle prestazioni. Questo è venuto alla mia attenzione mentre stavo registrando "chiamato" all'interno di una funzione che è stata invocata su centinaia di componenti React durante il rendering. La semplice presenza del codice di registrazione ha causato balbuzie molto evidenti durante gli aggiornamenti frequenti.
Lev

80

In realtà, console.logè molto più lento di una funzione vuota. L'esecuzione di questo test jsPerf sul mio Chrome 38 dà risultati sorprendenti:

  • quando la console del browser è chiusa, la chiamata console.logè circa 10.000 volte più lenta della chiamata di una funzione vuota,
  • e quando la console è aperta, chiamarla è fino a 100 000 volte più lenta .

Non che noterai il ritardo delle prestazioni se hai un numero ragionevole di console.…chiamate che si attivano una volta (cento richiederanno 2 ms sulla mia installazione di Chrome o 20 ms quando la console è aperta). Ma se accedi ripetutamente alla console, ad esempio requestAnimationFramecollegandola attraverso , può rendere le cose janky.

Aggiornare:

In questo test ho anche verificato l'idea di un "registro nascosto" personalizzato per la produzione, con una variabile che contiene i messaggi di registro, disponibile su richiesta. Si scopre che lo è

  • circa 1000 volte più veloce del nativo console.log,
  • e ovviamente 10.000 volte più veloce se l'utente ha la sua console aperta.

1
Quando un compilatore vede una funzione vuota, non esegue nulla se vede una riga per eseguirla dovrà eseguire la funzione. il compilatore semplicemente non esegue una funzione vuota e inutilizzata come ottimizzazione.
SidOfc

1
@SidneyLiebrand grazie per le informazioni, buono a sapersi. I risultati del secondo test possono essere ottimizzati allo stesso modo come console.logse fosse. Entrambe sono funzioni che producono effetti collaterali.
tomekwi

1
console.logdi per sé non ha un impatto sulle prestazioni in un modo che noterai a meno che non lo associ a un gestore di scorrimento / ridimensionamento. Questi vengono chiamati molto e se il tuo browser deve inviare testo alla console come 30 / 60x al secondo può diventare brutto. E poi c'è quel bug di IE che non ti permetteva di avere console.lognulla con la console chiusa :(
SidOfc

1
Hai assolutamente ragione - l'ho scritto anche nella mia risposta. Come regola generale, cerco di non avere chiamate della console nel codice di produzione. Ma le prestazioni non sono la ragione - è piuttosto perché "è troppo facile per un profano leggere i tuoi log", come ha scritto @Ramesh.
tomekwi

1
logging-on x 3,179 ops/sec ±2.07% (56 runs sampled) logging-off x 56,058,330 ops/sec ±2.87% (56 runs sampled) logging-off-stringify x 1,812,379 ops/sec ±3.50% (58 runs sampled) log-nothing x 59,509,998 ops/sec ±2.63% (59 runs sampled)
Casey


10

Se crei un collegamento alla console in uno script di base comune, ad esempio:

var con = console;

e quindi usa con.log ("messaggio") o con.error ("messaggio di errore") in tutto il codice, in produzione puoi semplicemente ricablare con nella posizione principale per:

var con = {
    log: function() {},
    error: function() {},
    debug: function() {}
}

16
il modo sporco:console.log = function(){}
br4nnigan

8

L'uso della funzionalità di debug console.log ridurrà le prestazioni di esecuzione di JavaScript? Influirà sulla velocità di esecuzione degli script negli ambienti di produzione?

Ovviamente, console.log()ridurrà le prestazioni del tuo programma poiché richiede tempo di calcolo.

Esiste un approccio per disabilitare i log della console negli ambienti di produzione da un unico percorso di configurazione?

Inserisci questo codice all'inizio dello script per sostituire la funzione console.log standard con una funzione vuota.

console.log = function () { };

2
Questa sembra essere una delle soluzioni più semplici per disabilitare i log della console nell'ambiente di produzione. Chiedendosi perché non ha più attenzione! Possiamo controllare la definizione di questa funzione vuota sotto una variabile che possiamo impostare come vero / falso a seconda dell'ambiente su cui stiamo lavorando (prod o dev)
Anshuman Manral

2
Questa è una risposta così brillante! Grazie!
Systems Rebooter

6

Qualsiasi chiamata di funzione ridurrà leggermente le prestazioni. Ma alcuni console.lognon dovrebbero avere alcun effetto evidente.

Tuttavia genererà errori indefiniti nei browser meno recenti che non supportano console


3

Il calo delle prestazioni sarà minimo, tuttavia nei browser meno recenti causerà errori JavaScript se la console dei browser degli utenti non è aperta log is not a function of undefined. Ciò significa che tutto il codice JavaScript dopo la chiamata console.log non verrà eseguito.

È possibile creare un wrapper per verificare se window.consoleè un oggetto valido, quindi chiamare console.log nel wrapper. Qualcosa di semplice come questo funzionerebbe:

window.log = (function(console) {
    var canLog = !!console;
    return function(txt) {
        if(canLog) console.log('log: ' + txt);
    };
})(window.console);

log('my message'); //log: my message

Ecco un violino: http://jsfiddle.net/enDDV/


2

Ho fatto questo test jsPerf: http://jsperf.com/console-log1337

Non sembra richiedere più tempo rispetto ad altre chiamate di funzione.

E i browser che non dispongono di un'API della console? Se è necessario utilizzare console.log per il debug, è possibile includere uno script nella distribuzione di produzione per sovrascrivere l'API della console, come suggerisce Paul nella sua risposta.


se posso selezionare due risposte, questo andrà all'inizio
Sudantha

1
Il tuo test non solo aggiunge una chiamata console.log, ma esegue anche la stessa operazione jquery due volte. Ho creato la seguente revisione del tuo test, spero che aiuti: jsperf.com/console-log1337/7 PS: grazie, non sapevo di jsperf.com :)
dubrox

2
In realtà sembra essere molto più lento di una normale chiamata di funzione. In un duello diretto i risultati sono incomparabili: jsperf.com/console-log1337/14
tomekwi

1
Cattiva risposta. Nemmeno lontanamente corretto. Auguri voti positivi come @tomekwi dimostra che la differenza è notevole. Ho eseguito personalmente diversi test nel mondo reale e posso assolutamente dire senza ombra di dubbio che lo spamming console.log provoca sicuramente un calo delle prestazioni. Qualche registro qua e là ogni secondo o due, non è un grosso problema, ma registra qualcosa di frequente (sugli aggiornamenti del frame, sui ri-rendering di componenti enormi) e la differenza con e senza console.log è notte e giorno.
Lev

0

Lo faccio in questo modo per mantenere la firma originale dei metodi della console. In una posizione comune, caricata prima di qualsiasi altro JS:

var DEBUG = false; // or true 

Quindi in tutto il codice

if (DEBUG) console.log("message", obj, "etc");
if (DEBUG) console.warn("something is not right", obj, "etc");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.