Уменьшит ли использование функции отладки console.log
производительность выполнения JavaScript? Повлияет ли это на скорость выполнения скриптов в производственных средах?
Есть ли способ отключить журналы консоли в производственных средах из одного места конфигурации?
javascript
performance
Суданта
источник
источник
console.log
Ответы:
Если вы собираетесь разместить это на общедоступном сайте или что-то в этом роде, любой, кто мало знает об использовании инструментов разработчика, может прочитать ваши сообщения отладки. В зависимости от того, что вы регистрируете, это может быть нежелательным поведением.
Один из лучших подходов - заключить
console.log
в один из ваших методов, где вы можете проверить условия и выполнить его. В производственной сборке этих функций можно избежать. В этом вопросе о переполнении стека подробно рассказывается о том, как сделать то же самое с помощью компилятора Closure .Итак, чтобы ответить на ваши вопросы:
но незначительно.источник
conosle.log
будет по-прежнему попадать в переопределенную функцию, не так ли?console.log
объектов в журнале вызывает утечку памяти, поскольку браузер сохраняет структуру объекта, чтобы разработчики могли расширять журнал.На самом деле
console.log
это намного медленнее, чем пустая функция. Выполнение этого теста jsPerf на моем Chrome 38 дает потрясающие результаты:console.log
происходит примерно в 10 000 раз медленнее, чем вызов пустой функции,Не то, чтобы вы заметили отставание в производительности, если у вас есть разумное количество
console.…
вызовов, запускаемых один раз (сотня займет 2 мс при моей установке Chrome - или 20 мс, когда консоль открыта). Но если вы многократно записываете данные в консоль - например, подключаете их к сетиrequestAnimationFrame
- это может сделать работу некорректной.Обновить:
В этом тесте я также проверил идею настраиваемого «скрытого журнала» для производства - наличие переменной, которая содержит сообщения журнала, доступные по запросу. Оказывается
console.log
,источник
console.log
. Обе они являются функциями, вызывающими побочные эффекты.console.log
сам по себе на самом деле не влияет на производительность таким образом, который вы заметите, если не привязать его к обработчику прокрутки / изменения размера. Они называются много, и если вашему браузеру нужно отправлять текст на консоль, например, 30/60 раз в секунду, это может стать некрасивым. И еще есть ошибка IE, которая не позволяла вам вообще иметьconsole.log
его с закрытой консолью :(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')
источник
Если вы создаете ярлык для консоли в общем основном скрипте, например:
var con = console;
а затем используйте con.log («сообщение») или con.error («сообщение об ошибке») во всем своем коде, при производстве вы можете просто перенаправить con в основном месте на:
var con = { log: function() {}, error: function() {}, debug: function() {} }
источник
console.log = function(){}
Конечно,
console.log()
это снизит производительность вашей программы, так как требует вычислительного времени.Поместите этот код в начало вашего скрипта, чтобы заменить стандартную функцию console.log пустой функцией.
console.log = function () { };
источник
Любой вызов функции немного снизит производительность. Но несколько
console.log
не должны иметь заметного эффекта.Однако это вызовет неопределенные ошибки в старых браузерах, которые не поддерживают
console
источник
Падение производительности будет минимальным, однако в старых браузерах это вызовет ошибки 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/
источник
Я сделал этот тест jsPerf: http://jsperf.com/console-log1337
Кажется, это не займет больше времени, чем вызов других функций.
А как насчет браузеров, у которых нет консольного API? Если вам нужно использовать console.log для отладки, вы можете включить сценарий в свое производственное развертывание, чтобы переопределить консольный API, как предлагает Пол в своем ответе.
источник
Я делаю это таким образом, чтобы сохранить исходную сигнатуру методов консоли. В общем месте, загруженном перед любым другим JS:
var DEBUG = false; // or true
Затем во всем коде
if (DEBUG) console.log("message", obj, "etc"); if (DEBUG) console.warn("something is not right", obj, "etc");
источник