Czy użycie funkcji debugowania console.log
zmniejszy wydajność wykonywania JavaScript? Czy wpłynie to na szybkość wykonywania skryptów w środowiskach produkcyjnych?
Czy istnieje podejście do wyłączania dzienników konsoli w środowiskach produkcyjnych z jednej lokalizacji konfiguracji?
javascript
performance
Sudantha
źródło
źródło
console.log
trwa ~ 50 msOdpowiedzi:
Jeśli masz zamiar mieć to w witrynie publicznej lub w czymś podobnym, każdy, kto ma niewielką wiedzę na temat korzystania z narzędzi programistycznych, może przeczytać twoje wiadomości debugowania. W zależności od tego, co rejestrujesz, może to nie być pożądane zachowanie.
Jednym z najlepszych podejść jest zawinięcie metody
console.log
w jedną z metod oraz sprawdzenie warunków i wykonanie jej. W kompilacji produkcyjnej można uniknąć posiadania tych funkcji. To pytanie dotyczące przepełnienia stosu zawiera szczegółowe informacje o tym, jak zrobić to samo za pomocą kompilatora Closure .A więc odpowiadając na pytania:
ale tylko nieznacznie.źródło
conosle.log
będzie nadal działało na zastąpioną funkcję, prawda?console.log
do rejestrowania obiektów powoduje wyciek pamięci, ponieważ przeglądarka zachowuje strukturę obiektów, aby umożliwić programistom rozszerzenie dziennika.W rzeczywistości
console.log
jest znacznie wolniejszy niż funkcja pusta. Uruchomienie tego testu jsPerf na moim Chrome 38 daje oszałamiające wyniki:console.log
jest około 10000 razy wolniejsze niż wywołanie pustej funkcji,Nie to, że zauważysz opóźnienie wydajności, jeśli masz rozsądną liczbę plików
console.…
wywołań uruchomionych raz (sto zajmie 2 ms przy mojej instalacji Chrome - lub 20 ms, gdy konsola jest otwarta). Ale jeśli wielokrotnie logujesz rzeczy do konsoli - na przykład podłączasz je do konsolirequestAnimationFrame
- może to spowodować szarpnięcie.Aktualizacja:
W tym teście sprawdziłem również pomysł niestandardowego „ukrytego dziennika” do produkcji - posiadającego zmienną, która przechowuje komunikaty dziennika, dostępną na żądanie. Okazuje się, że tak
console.log
,źródło
console.log
gdyby. Obie są funkcjami, które powodują skutki uboczne.console.log
Samo w sobie nie wpływa na wydajność w sposób, który zauważysz, chyba że powiążesz go z obsługą przewijania / zmiany rozmiaru. Nazywa się je dużo i jeśli twoja przeglądarka musi wysyłać tekst do konsoli, jak 30 / 60x na sekundę, może być brzydki. A potem jest ten błąd IE, który w ogóle nie pozwalał na toconsole.log
przy zamkniętej konsoli :(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)
const DEBUG = true / false DEBUG && console.log('string')
źródło
Jeśli utworzysz skrót do konsoli we wspólnym podstawowym skrypcie, np .:
var con = console;
a następnie użyj con.log ("komunikat") lub con.error ("komunikat o błędzie") w całym kodzie, na produkcji możesz po prostu zmienić połączenie w głównej lokalizacji, aby:
var con = { log: function() {}, error: function() {}, debug: function() {} }
źródło
console.log = function(){}
Oczywiście
console.log()
zmniejszy to wydajność programu, ponieważ wymaga czasu obliczeniowego.Umieść ten kod na początku skryptu, aby zastąpić standardową funkcję console.log pustą funkcją.
console.log = function () { };
źródło
Każde wywołanie funkcji nieznacznie zmniejszy wydajność. Ale kilka
console.log
z nich nie powinno przynieść zauważalnego efektu.Jednak będzie generować niezdefiniowane błędy w starszych przeglądarkach, które nie obsługują
console
źródło
Uderzenie w wydajność będzie minimalne, jednak w starszych przeglądarkach spowoduje błędy JavaScript, jeśli konsola przeglądarek użytkowników nie jest otwarta
log is not a function of undefined
. Oznacza to, że cały kod JavaScript po wywołaniu console.log nie zostanie wykonany.Możesz utworzyć opakowanie, aby sprawdzić, czy
window.console
jest to prawidłowy obiekt, a następnie wywołać w opakowaniu console.log. Coś tak prostego mogłoby zadziałać:window.log = (function(console) { var canLog = !!console; return function(txt) { if(canLog) console.log('log: ' + txt); }; })(window.console); log('my message'); //log: my message
Oto skrzypce: http://jsfiddle.net/enDDV/
źródło
Zrobiłem ten test jsPerf: http://jsperf.com/console-log1337
Wydaje się, że nie trwa to dłużej niż inne wywołania funkcji.
A co z przeglądarkami, które nie mają interfejsu API konsoli? Jeśli potrzebujesz użyć console.log do debugowania, możesz dołączyć skrypt do wdrożenia produkcyjnego, aby zastąpić interfejs API konsoli, jak sugeruje Paul w swojej odpowiedzi.
źródło
Robię to w ten sposób, aby zachować oryginalny podpis metod konsolowych. We wspólnej lokalizacji, ładowanej przed jakimkolwiek innym JS:
var DEBUG = false; // or true
Następnie w całym kodzie
if (DEBUG) console.log("message", obj, "etc"); if (DEBUG) console.warn("something is not right", obj, "etc");
źródło