繁体   English   中英

console.log 会降低 JavaScript 执行性能吗?

[英]Will console.log reduce JavaScript execution performance?

使用调试特性console.log会降低 JavaScript 执行性能吗? 会不会影响生产环境脚本的执行速度?

有没有一种方法可以从单个配置位置禁用生产环境中的控制台日志?

实际上, console.log比空函数慢很多。 在我的 Chrome 38 上运行这个 jsPerf 测试给出了惊人的结果:

  • 当浏览器控制台关闭时,调用console.log比调用空函数慢大约 10 000 倍
  • 当控制台打开时,调用它会慢 100 000 倍

并不是说如果你有合理数量的console.… ,你会注意到性能延迟console.…调用一次(在我安装 Chrome 时,100 将需要 2 毫秒 - 或者在控制台打开时需要 20 毫秒)。 但是,如果您重复地将内容记录到控制台——例如,通过requestAnimationFrame将其连接起来——它会使事情变得混乱。

更新:

在这个测试中,我还检查了用于生产的自定义“隐藏日志”的想法——有一个保存日志消息的变量,可按需使用。 原来是

  • 比原生console.log约 1000 倍
  • 如果用户打开控制台,显然会快 10 000 倍。

如果您打算在公共站点或其他地方使用它,任何对使用开发人员工具知之甚少的人都可以阅读您的调试消息。 根据您正在记录的内容,这可能不是理想的行为。

最好的方法之一是将console.log包装在您的方法之一中,您可以在其中检查条件并执行它。 在生产版本中,您可以避免使用这些功能。 这个Stack Overflow 问题详细讨论了如何使用Closure 编译器来做同样的事情。

所以,回答你的问题:

  1. 是的,它会降低速度, 虽然只是微不足道。
  2. 但是,不要使用它,因为人们很容易阅读您的日志。
  3. 这个问题的答案可能会给你一些关于如何将它们从生产中删除的提示。
const DEBUG = true / false
DEBUG && console.log('string')

使用调试功能 console.log 会降低 JavaScript 执行性能吗? 会不会影响生产环境中脚本的执行速度?

当然, console.log()会降低程序的性能,因为它需要计算时间。

是否有一种方法可以从单个配置位置禁用生产环境中的控制台日志?

将此代码放在脚本的开头以将标准 console.log 函数覆盖为空函数。

console.log = function () { };

如果您在通用核心脚本中创建控制台的快捷方式,例如:

var con = console;

然后在整个代码中使用 con.log("message") 或 con.error("error message"),在生产中,您可以简单地将核心位置的 con 重新连接到:

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

任何函数调用都会略微降低性能。 但是一些console.log应该不会有任何明显的影响。

但是它会在不支持console旧浏览器中抛出未定义的错误

性能影响很小,但是在旧浏览器中,如果用户浏览器控制台未打开,它会导致 JavaScript 错误log is not a function of undefined 这意味着在 console.log 调用之后的所有 JavaScript 代码都不会执行。

您可以创建一个包装器来检查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,就像 Paul 在他的回答中建议的那样。

我这样做是为了维护控制台方法的原始签名。 在一个公共位置,在任何其他 JS 之前加载:

var DEBUG = false; // or true 

然后在整个代码

if (DEBUG) console.log("message", obj, "etc");
if (DEBUG) console.warn("something is not right", obj, "etc");

我更喜欢这样做:

export const println = (*args,) => {
   if(process.env.NODE_ENV === "development") console.log(args)
}

然后在你的代码中到处使用println

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM