[英]Will console.log reduce JavaScript execution performance?
使用调试特性console.log
会降低 JavaScript 执行性能吗? 会不会影响生产环境脚本的执行速度?
有没有一种方法可以从单个配置位置禁用生产环境中的控制台日志?
实际上, console.log
比空函数慢很多。 在我的 Chrome 38 上运行这个 jsPerf 测试给出了惊人的结果:
console.log
比调用空函数慢大约 10 000 倍, 并不是说如果你有合理数量的console.…
,你会注意到性能延迟console.…
调用一次(在我安装 Chrome 时,100 将需要 2 毫秒 - 或者在控制台打开时需要 20 毫秒)。 但是,如果您重复地将内容记录到控制台——例如,通过requestAnimationFrame
将其连接起来——它会使事情变得混乱。
在这个测试中,我还检查了用于生产的自定义“隐藏日志”的想法——有一个保存日志消息的变量,可按需使用。 原来是
console.log
快约 1000 倍,如果您打算在公共站点或其他地方使用它,任何对使用开发人员工具知之甚少的人都可以阅读您的调试消息。 根据您正在记录的内容,这可能不是理想的行为。
最好的方法之一是将console.log
包装在您的方法之一中,您可以在其中检查条件并执行它。 在生产版本中,您可以避免使用这些功能。 这个Stack Overflow 问题详细讨论了如何使用Closure 编译器来做同样的事情。
所以,回答你的问题:
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.