JavaScript是否会自动跳过空/无身体功能?

时间:2019-06-18 14:21:11

标签: javascript function if-statement optimization

包括“ 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()

1 个答案:

答案 0 :(得分:1)

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

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

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

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