JavaScript автоматически пропускает пустые / бездействующие функции? - PullRequest
0 голосов
/ 18 июня 2019

"tl; dr" включено

При попытке отключить ведение журнала, чтобы избежать спама после развертывания, я делал что-то вроде

if (isDebug)
    console.log(...);

но я чувствовал, что (или читать онлайн) это замедлит код в целом, потому что условие будет оцениваться каждый раз (и я обычно включаю много из них, и функции часто вызываются, либо через циклы, setIntervals или w /e).

Таким образом, теперь я переключился на простое «очищение» функций с помощью специального регистратора, например

function LOGGER_MODULE_FACTORY() {
  let current_log_level = "log";
  return {
    log: console.log,
    info: console.info,
    warn: console.warn,
    error: console.error,
    setDebug: function(logLevel) {
      current_log_level = logLevel;
      this.log = (logLevel === true || logLevel === "log") ? console.log : function () {};
      this.info = (logLevel === true || logLevel === "log" || logLevel === "info") ? console.info : function () {};
      this.warn = (logLevel === true  || logLevel === "log" || logLevel === "info" || logLevel === "warn") ? console.warn : function () {};
      this.error = (!logLevel) ? function () {} : console.error;
      return logLevel;
    },
    getCurrent_log_level: function () { return current_log_level; }
  }
}

Считая, что, вероятно, быстрее запустить пустую функцию, чем вычислять выражение, было легче писать.

Я попытался создать скрипку , чтобы проверить мою теорию и сравнить производительность, но значения часто довольно случайны ...

Редактировать : jsperf test Интересные результаты. Результаты "Chrome 64" получены при запуске на Edge.

Мое рассуждение основывалось на том факте, что я мало что читаю о процессорах и, по-видимому, они делают что-то самостоятельно, чтобы оптимизировать общее время выполнения, например, пропуская бесполезные операции: скажем, у нас есть:

a = x
b = y
c = a + 3

Процессор фактически игнорировал бы вторую строку (или что-то ... Я далеко не эксперт, ага, я просто с любопытством прочитал этот факт).

Теперь, поскольку в нашем браузере мы можем в любой момент получить доступ к любой объявленной глобально переменной с помощью консоли, это не может произойти, и поэтому я решил просто спросить в Интернете:

ТЛ; др:

Повторно ли вызывать пустую функцию / функцию без тела (страницы, которые я создаю, в основном, работают 24/7 на панели инструментов) лучше, с точки зрения производительности, чем помещать условие перед исходной функцией (console.log / info / warn / error)?

По сути, вы спрашиваете, что быстрее f = () => {}; f () или flag = false; if (флаг) f ()

1 Ответ

1 голос
/ 18 июня 2019

isDebug не будет оцениваться при каждом выполнении, но сохраненная переменная будет просто прочитана.

Было бы иначе, если бы оно было if (isDebug()), в этом случае каждый раз, когда синтаксический анализатор встречает утверждение, функция будет оцениваться.

Очевидно, что чтение логической переменной isDebug добавит некоторых издержек, но это не заметно, поскольку чтение и обработка переменной является основной целью языка программирования, поэтому время, необходимое для чтения логической переменной, всегда будет меньше, чем любое другое утверждение в коде.

Переназначение функции console.log - неплохая идея, она может быть полезна для включения или выключения журналов в одной точке. Но это решение другой проблемы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...