Wird die Verwendung der Debugging-Funktion console.log
die Ausführungsleistung von JavaScript verringern? Wird dies die Geschwindigkeit der Skriptausführung in Produktionsumgebungen beeinflussen?
Gibt es einen Ansatz zum Deaktivieren von Konsolenprotokollen in Produktionsumgebungen von einem einzigen Konfigurationsspeicherort aus?
javascript
performance
Sudantha
quelle
quelle
console.log
dauert ~ 50msAntworten:
Wenn Sie dies auf einer öffentlichen Website oder so etwas haben, kann jeder, der wenig über die Verwendung der Entwicklertools weiß, Ihre Debug-Meldungen lesen. Je nachdem, was Sie protokollieren, ist dies möglicherweise kein wünschenswertes Verhalten.
Einer der besten Ansätze besteht darin, die
console.log
Methode in eine Ihrer Methoden einzuschließen und sie auf Bedingungen zu überprüfen und auszuführen. In einem Produktions-Build können Sie diese Funktionen vermeiden. In dieser Frage zum Stapelüberlauf wird ausführlich erläutert, wie Sie dasselbe mit dem Closure-Compiler tun können .Um Ihre Fragen zu beantworten:
wenn auch nur vernachlässigbar.quelle
conosle.log
Wille macht immer noch einen Treffer für die überschriebene Funktion, nicht wahr?console.log
zum Protokollieren von Objekten führt zu einem Speicherverlust, da der Browser die Objektstruktur beibehält, damit Entwickler das Protokoll erweitern können.Eigentlich
console.log
ist viel langsamer als eine leere Funktion. Laufen diese jsPerf Test auf meinem Chrome 38 gibt erstaunliche Ergebnisse:console.log
ist der Aufruf etwa 10 000 Mal langsamer als der Aufruf einer leeren Funktion.Nicht, dass Sie die Leistungsverzögerung bemerken würden, wenn eine angemessene Anzahl von
console.…
Anrufen einmal ausgelöst wird (hundert werden bei meiner Chrome-Installation 2 ms dauern - oder 20 ms, wenn die Konsole geöffnet ist). Wenn Sie jedoch wiederholtrequestAnimationFrame
Inhalte an der Konsole protokollieren, z. B. wenn Sie sie anschließen, kann dies zu Problemen führen.Aktualisieren:
In diesem Test habe ich auch die Idee eines benutzerdefinierten „versteckten Protokolls“ für die Produktion überprüft - mit einer Variablen, die Protokollnachrichten enthält und bei Bedarf verfügbar ist. Es stellt sich heraus, zu sein
console.log
,quelle
console.log
. Beide sind Funktionen, die Nebenwirkungen hervorrufen.console.log
An sich wirkt sich dies nicht wirklich auf die Leistung aus, die Sie bemerken werden, es sei denn, Sie binden es an einen Handler zum Scrollen / Ändern der Größe. Diese werden häufig aufgerufen, und wenn Ihr Browser 30 / 60x pro Sekunde Text an die Konsole senden muss, kann dies hässlich werden. Und dann gibt es diesen IE-Fehler, der es Ihnen überhaupt nicht erlaubt hatconsole.log
, bei geschlossener Konsole zu sein :(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)
quelle
Wenn Sie in einem allgemeinen Kernskript eine Verknüpfung zur Konsole erstellen, z.
und verwenden Sie dann con.log ("message") oder con.error ("error message") im gesamten Code. Bei der Produktion können Sie con einfach am Kernspeicherort neu verkabeln, um:
quelle
console.log = function(){}
Dies
console.log()
verringert natürlich die Leistung Ihres Programms, da dies Rechenzeit in Anspruch nimmt.Fügen Sie diesen Code am Anfang Ihres Skripts ein, um die Standardfunktion console.log in eine leere Funktion zu überschreiben.
quelle
Jeder Funktionsaufruf verringert die Leistung geringfügig . Einige
console.log
sollten jedoch keine spürbare Wirkung haben.In älteren Browsern, die dies nicht unterstützen, werden jedoch undefinierte Fehler ausgegeben
console
quelle
Die Leistungseinbußen sind minimal, in älteren Browsern treten jedoch JavaScript-Fehler auf, wenn die Browserkonsole des Benutzers nicht geöffnet ist
log is not a function of undefined
. Dies bedeutet, dass der gesamte JavaScript-Code nach dem Aufruf von console.log nicht ausgeführt wird.Sie können einen Wrapper erstellen, um zu überprüfen, ob
window.console
es sich um ein gültiges Objekt handelt, und dann console.log im Wrapper aufrufen. So etwas Einfaches würde funktionieren:Hier ist eine Geige: http://jsfiddle.net/enDDV/
quelle
Ich habe diesen jsPerf-Test durchgeführt: http://jsperf.com/console-log1337
Es scheint nicht länger zu dauern als andere Funktionsaufrufe.
Was ist mit Browsern ohne Konsolen-API? Wenn Sie console.log zum Debuggen verwenden müssen, können Sie ein Skript in Ihre Produktionsbereitstellung aufnehmen, um die Konsolen-API zu überschreiben, wie Paul in seiner Antwort vorschlägt.
quelle