Чи дозволить console.log знизити продуктивність виконання JavaScript?


99

Чи буде використання функції налагодження console.logзнизити продуктивність виконання JavaScript? Чи вплине це на швидкість виконання сценарію у виробничих середовищах?

Чи існує підхід для вимкнення журналів консолі у виробничих середовищах з одного місця конфігурації?


На сьогодні всі відповіді припускають, що ви просто виводите рядкові повідомлення. А як щодо продуктивності обліку об'єктів з можливо великими об'єктними структурами? наприклад console.log (великийObj)?
PandaWood

Виведення значної кількості об'єктів на консоль може перетворити завантаження на 3 секунди сторінки за 30 секунд. Просто приклад ...
Андрій

Простий console.logзаймає ~ 50ms
Pedram marandi

Відповіді:


55

Якщо ви збираєтеся мати це на загальнодоступному веб-сайті або щось подібне, кожен, хто має мало знань щодо використання інструментів розробника, може прочитати ваші повідомлення про налагодження. Залежно від того, що ви реєструєте, це може бути не бажаною поведінкою.

Один з найкращих підходів - це ввести console.logодин із своїх методів, і там, де ви можете перевірити умови та виконати його. У виробничій збірці ви можете уникати цих функцій. Це запитання про переповнення стека детально розповідає про те, як це зробити за допомогою компілятора закриття .

Отже, щоб відповісти на ваші запитання:

  1. Так, це знизить швидкість, хоча лише незначно.
  2. Але не використовуйте це, оскільки людині занадто просто читати ваші журнали.
  3. Відповіді на це питання можуть дати вам підказки, як їх вилучити з виробництва.

дякую, але все-таки загортання conosle.logволі все ще зробить удар по перекривленій функції, чи не так?
Суданта

15
Лише зауваження - використання console.logдля реєстрації об’єктів спричиняє витік пам'яті, оскільки браузер зберігає структуру об'єктів, щоб розробники могли розширити журнал.
Шамасіс Бхаттачарія


8
"людині занадто просто читати ваші журнали" - Як це проблема? Це JavaScript, вони вже мають повний доступ до вихідного коду!
Квентін

4
Тільки щоб задзвонити: я щойно виявив, що спам консолі.log навіть із тим самим статичним текстом (жоден об’єкт чи масив; буквально просто console.log ('тест') не робив би це) також спричиняє хіт продуктивності. Це мені припало до уваги, коли я реєстрував "виклик" у межах функції, яка викликала сотні компонентів React під час повторного відтворення. Сама наявність коду реєстрації викликала дуже помітне заїкання під час частих оновлень.
Лев

80

Насправді console.logце набагато повільніше, ніж порожня функція. Запуск цього тесту jsPerf на моєму Chrome 38 дає приголомшливі результати:

  • коли консоль браузера закрита, що викликає console.logце близько 10 000 разів повільніше , ніж виклик порожньої функції,
  • а коли консоль відкрита, виклик її в 100 000 разів повільніше .

Не те, що ви помітите відставання продуктивності, якщо у вас буде разумна кількість console.…викликів один раз (сто займе 2 мс при моїй установці Chrome - або 20 мс, коли консоль відкрита). Але якщо ви реєструєте речі на консолі неодноразово - наприклад, підключаючи їх requestAnimationFrame- це може зробити речі незграбними.

Оновлення:

У цьому тесті я також перевірив ідею спеціального "прихованого журналу" для виробництва - із змінною, яка містить повідомлення журналу, доступна на вимогу. Це виявляється

  • приблизно в 1000 разів швидше, ніж рідний console.log,
  • і, очевидно, в 10 000 разів швидше, якщо у користувача відкрита консоль.

1
Коли компілятор бачить порожню функцію, він не виконує нічого більш мокрим, оскільки бачить рядок для його виконання, йому доведеться запустити функцію. компілятор просто не виконує порожню, невикористану функцію в якості оптимізації.
SidOfc

1
@SidneyLiebrand дякую за інформацію, це добре знати. Результати другого випробування можна оптимізувати так само, як і console.logякщо б. Обидві вони є функціями, які викликають побічні ефекти.
tomekwi

1
console.logсам по собі насправді не впливає на продуктивність таким чином, який ви помітите, якщо не прив'язати його до обробника прокрутки / зміни розміру. Їх часто дзвонять, і якщо ваш браузер повинен надсилати текст на консоль приблизно 30 / 60x в секунду, це може стати некрасивим. А тут є та помилка IE, яка не дозволила вам взагалі мати console.logзакриту консоль :(
SidOfc

1
Ви абсолютно праві - це я і написав у своїй відповіді. Як правило, я намагаюся не мати викликів консолей у виробничому коді. Але продуктивність - не причина - скоріше тому, що "непрофесіоналу занадто легко читати ваші журнали", як писав @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)
Кейсі


10

Якщо ви створюєте ярлик до консолі у загальному сценарії, наприклад:

var con = console;

а потім використовувати con.log ("повідомлення") або con.error ("повідомлення про помилку") у всьому своєму коді, при виробництві ви можете просто перенести з'єднання con в основне місце, щоб:

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

16
брудний шлях:console.log = function(){}
br4nnigan

8

Чи буде використання функції налагодження console.log знизити продуктивність виконання JavaScript? Чи вплине це на швидкість виконання сценарію у виробничих середовищах?

Звичайно, console.log()це знизить продуктивність вашої програми, оскільки це потребує обчислювального часу.

Чи існує підхід для вимкнення журналів консолі у виробничих середовищах з одного місця конфігурації?

Поставте цей код на початку вашого сценарію, щоб замінити стандартну функцію console.log на порожню функцію.

console.log = function () { };

2
Здається, це одне з найпростіших рішень для відключення консольних журналів у виробничому середовищі. Цікаво, чому вона не має більшої уваги! Ми можемо керувати визначенням цієї порожньої функції під змінною, яку можна переключити як істинну / хибну залежно від того, над яким середовищем ми працюємо (prod чи dev)
Anshuman Manral

2
Це така геніальна відповідь! Дякую!
System Rebooter

6

Будь-який функціональний дзвінок дещо знизить продуктивність. Але деякі console.logз них не повинні мати помітного ефекту.

Однак це призведе до невизначених помилок у старих браузерах, які не підтримують console


3

Показ ефективності буде мінімальним, однак у старих браузерах це призведе до помилок JavaScript, якщо консоль браузерів користувачів не відкрита log is not a function of undefined. Це означає, що весь код JavaScript після виклику console.log не виконується.

Ви можете створити обгортку, щоб перевірити, чи window.consoleє дійсним об’єктом, а потім викликати console.log у обгортці. Щось таке, як це було б, спрацювало:

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

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

Ось загадка: http://jsfiddle.net/enDDV/


2

Я зробив цей тест на jsPerf: http://jsperf.com/console-log1337

Здається, це не займає більше часу, ніж інші виклики функцій.

А як щодо браузерів, які не мають консольного API? Якщо вам потрібно використовувати console.log для налагодження, ви можете включити скрипт у своє виробниче розгортання, щоб змінити API консолі, як пропонує Павло у своїй відповіді.


якщо я можу вибрати дві відповіді, це піде вгору
Суданта

1
Ваш тест не тільки додає console.log виклик, але й виконує одну і ту ж операцію jquery двічі. Я створив наступну версію вашого тесту, сподіваюся, що це допоможе: jsperf.com/console-log1337/7 PS: спасибі, я не знав про jsperf.com :)
dubrox

2
Це насправді здається набагато повільніше, ніж звичайний виклик функції. У прямому поєдинку результати непорівнянні: jsperf.com/console-log1337/14
tomekwi

1
Погана відповідь. Навіть не віддалено виправити. Бажаюче підняття голосів, коли @tomekwi демонструє різницю, є надзвичайною. Я сам зробив кілька реальних тестів і можу абсолютно сказати без тіні сумнівів, що спам console.log безумовно спричиняє хіт продуктивності. Кілька журналів тут і там щосекунди чи дві, нічого не робити, але щось часто записуйте (на оновлення кадру, повторно відображає масивні компоненти), а різниця з консолем.log і без нього - це ніч і день.
Лев

0

Я роблю це таким чином, щоб підтримувати оригінальний підпис методів консолі. У загальному місці, завантаженому перед будь-яким іншим JS:

var DEBUG = false; // or true 

Потім протягом усього коду

if (DEBUG) console.log("message", obj, "etc");
if (DEBUG) console.warn("something is not right", obj, "etc");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.