包含“ 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; }
  }
}


认为运行空函数可能比评估表达式更快,并且编写起来更干净。

我尝试创建一个fiddle来测试我的理论并比较性能,但是这些值通常是非常随机的...

编辑:jsperf test
有趣的结果。 “ Chrome 64”的结果来自在Edge上运行。

我的推理基于这样的事实:我几乎不了解CPU,并且显然它们是自己做的,以便优化总体运行时间,例如,跳过无用的操作:说我们有:

a = x
b = y
c = a + 3


CPU实际上会忽略第二行(或其他什么……我远不是专家啊,我只是好奇地读到了这一事实)。

现在,由于我们可以在浏览器上使用控制台在某个时候访问任何全局声明的变量,因此这不可能发生,所以我觉得我应该在线上询问一下:

tl; dr:

从性能角度来讲,与在原始函数(console.log / info / warn / error)前面放置条件相比,在性能方面,反复调用空/无肢函数(我创建的页面基本上在仪表板上运行24/7)更好吗?


  基本上,您在问哪个更快f =()=> {}; f()或flag = false;如果(标志)f()

最佳答案

isDebug不会在每次执行时都被求值,但是存储的变量将被读取。

如果它是if (isDebug()),则将有所不同,在这种情况下,每次解析器遇到该语句时,都会对函数进行求值。

显然,读取isDebug布尔变量会增加一些开销,但是这是无法察觉的,因为读取和处理变量是编程语言的主要目的,因此读取布尔值所需的时间将始终比其中的任何其他语句短。编码。

重新分配console.log功能不是一个坏主意,它对于一次启用或禁用所有日志很有用。但这是另一个问题的解决方案

09-28 10:24