Log 会降低 JavaScript 的执行性能吗?

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

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

63632 次浏览

对性能的影响将是最小的,但是在较老的浏览器中,如果用户浏览器控制台没有打开 log is not a function of undefined,就会导致 JavaScript 错误。这意味着在 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/

任何函数调用都会降低 有点的性能,但是少量的 console.log应该不会有任何明显的效果。

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

我做了这个 jsPerf 测试: http://jsperf.com/console-log1337

它似乎不会比其他函数调用花费更长的时间。

那么没有控制台 API 的浏览器呢?如果需要使用 console. log 进行调试,可以在生产部署中包含一个脚本来覆盖控制台 API,就像 Paul 在他的答案中建议的那样。

如果使用公共核心脚本创建控制台的快捷方式,例如:

var con = console;

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

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

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

最好的方法之一是将 console.log封装在您的一个方法中,并在其中检查条件并执行它。在生产构建中,可以避免使用这些函数。这个 堆栈溢出问题详细介绍了如何使用 闭包编译器来做同样的事情。

回答你们的问题:

  1. 是的,它会降低速度,虽然可以忽略不计。
  2. 但是,不要使用它,因为它太容易让人阅读您的日志。
  3. 这个问题的答案可能会给您提示如何从生产中删除它们。

实际上,console.log比一个空函数慢得多。在我的 Chrome 38上运行 这个 jsPerf 测试会得到惊人的结果:

  • 当浏览器控制台关闭时,调用 console.log比调用空函数的值为 慢了一万倍,
  • 当控制台打开时,调用它的速度会慢10万倍

并不是说你会注意到性能延迟,如果你有一个合理的数量 console.…调用触发一次(100将采取2毫秒在我的安装 Chrome-或20毫秒时,控制台打开)。但是如果你重复地把东西记录到控制台上——例如,通过 requestAnimationFrame连接到控制台上——它会让事情变得很糟糕。

更新:

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

  • 比原生 console.log快1000倍左右,
  • 显然,如果用户打开控制台,速度会提高10000倍。
const DEBUG = true / false
DEBUG && console.log('string')

将使用调试特性 console.log reduce JavaScript 执行性能? 它是否会影响 生产环境?

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

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

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

console.log = function () { };

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

var DEBUG = false; // or true

然后贯穿整个代码

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