Wird die Verwendung der Debugging-Funktion console.log
die JavaScript-Ausführungsleistung reduzieren? Beeinflusst dies die Geschwindigkeit der Skriptausführung in Produktionsumgebungen?
Gibt es eine Möglichkeit, Konsolenprotokolle in Produktionsumgebungen von einem einzigen Konfigurationsstandort aus zu deaktivieren?
Wenn Sie dies auf einer öffentlichen Website oder etwas anderem haben, kann jeder, der sich mit den Entwicklertools wenig auskennt, Ihre Debug-Nachrichten lesen. Je nachdem, was Sie protokollieren, ist dies möglicherweise nicht wünschenswert.
Eine der besten Methoden besteht darin, den console.log
in eine Ihrer Methoden zu packen und wo Sie nach Bedingungen suchen und sie ausführen können. In einem Produktions-Build können Sie diese Funktionen vermeiden. Diese Stack Overflow-Frage beschreibt ausführlich, wie Sie dies mit dem Closure-Compiler tun.
Also, um deine Fragen zu beantworten:
Tatsächlich ist console.log
viel langsamer als eine leere Funktion. Wenn Sie diesen jsPerf-Test auf meinem Chrome 38 ausführen, erhalten Sie erstaunliche Ergebnisse:
console.log
etwa 10.000 mal langsamer als der Aufruf einer leeren Funktion.Sie werden die Leistungsverzögerung nicht bemerken, wenn Sie eine angemessene Anzahl von console.…
-Anrufen haben, die einmal ausgelöst werden (einhundert dauert bei meiner Installation von Chrome 2 ms - oder 20 ms, wenn die Konsole geöffnet ist). Wenn Sie jedoch wiederholt Material an der Konsole protokollieren, beispielsweise durch Anschließen über requestAnimationFrame
, kann dies die Dinge sprunghaft machen.
In diesem Test habe ich auch die Idee eines benutzerdefinierten "versteckten Protokolls" für die Produktion geprüft - mit einer Variablen, die Protokollnachrichten enthält, die auf Anforderung verfügbar sind. Es stellt sich heraus, zu sein
console.log
,Wenn Sie eine Verknüpfung zur Konsole in einem allgemeinen Kernskript erstellen, z. B .:
var con = console;
verwenden Sie dann in Ihrem Code con.log ("message") oder con.error ("error message"). In der Produktion können Sie con am Kernspeicherort einfach neu verkabeln:
var con = {
log: function() {},
error: function() {},
debug: function() {}
}
const DEBUG = true / false
DEBUG && console.log('string')
Jeder Funktionsaufruf wird geringfügig die Leistung reduzieren. Ein paar console.log
sollten jedoch keine nennenswerten Auswirkungen haben.
In älteren Browsern, die console
nicht unterstützen, werden jedoch undefinierte Fehler ausgegeben.
Der Performance-Hit wird minimal sein. In älteren Browsern führt dies jedoch zu JavaScript-Fehlern, wenn die Browserkonsole des Benutzers log is not a function of undefined
nicht geöffnet ist. 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 prüfen, ob window.console
ein gültiges Objekt ist, und dann im Wrapper die Datei console.log aufzurufen. Etwas so einfaches würde funktionieren:
window.log = (function(console) {
var canLog = !!console;
return function(txt) {
if(canLog) console.log('log: ' + txt);
};
})(window.console);
log('my message'); //log: my message
Hier ist eine Geige: http://jsfiddle.net/enDDV/
Ich habe diesen jsPerf-Test gemacht: http://jsperf.com/console-log1337
Es scheint nicht länger als andere Funktionsaufrufe zu dauern.
Was ist mit Browsern, die keine Konsolen-API haben? Wenn Sie zum Debuggen auf console.log zurückgreifen müssen, können Sie ein Skript in Ihre Produktionsbereitstellung aufnehmen, um die Konsolen-API zu überschreiben, wie es Paul in seiner Antwort vorschlägt.
Wird das Debugging-Feature "console.log" verwendet, wird JavaScript .__ reduziert. Ausführungsleistung? Beeinflusst dies die Geschwindigkeit der Skriptausführung in Produktionsumgebungen?
Natürlich reduziert console.log()
die Leistung Ihres Programms, da dafür Rechenzeit erforderlich ist.
Gibt es einen Ansatz zum Deaktivieren von Konsolenprotokollen in der Produktion Umgebungen von einem einzigen Konfigurationsstandort aus?
Fügen Sie diesen Code am Anfang Ihres Skripts ein, um die Standardfunktion console.log durch eine leere Funktion zu überschreiben.
console.log = function () { };