console.log
调试功能的使用会降低 JavaScript 执行性能吗?它会影响生产环境中脚本执行的速度吗?
是否有一种方法可以从单个配置位置禁用生产环境中的控制台日志记录?
console.log
调试功能的使用会降低 JavaScript 执行性能吗?它会影响生产环境中脚本执行的速度吗?
是否有一种方法可以从单个配置位置禁用生产环境中的控制台日志记录?
实际上,console.log
比一个空函数要慢得多。在 Chrome 38 上运行 这个 jsPerf 测试,结果令人惊讶:
console.log
要比调用一个空函数慢大约 10,000 倍,如果您只有适量的 console.…
调用(例如一百次),您可能不会注意到性能延迟——我的 Chrome 安装程序上需要 2 毫秒(或在控制台打开时需要 20 毫秒)。但是,如果您反复记录信息到控制台,例如通过 requestAnimationFrame
连接它,那么它就会使事情变得卡顿。
在这个测试中,我还尝试了一个生产环境下的自定义“隐藏日志”——拥有一个变量来保存日志消息,按需提供。结果表明:
console.log
快大约 1,000 倍,console.log
一样进行优化。它们都是产生副作用的函数。 - tomekwiconsole.log
本身并不会对性能产生太大的影响,除非将其绑定到滚动/调整大小处理程序上。这些处理程序会被频繁调用,如果您的浏览器需要每秒向控制台发送30/60次文本,那么可能会变得很丑陋。还有一个IE的bug,如果控制台关闭,则无法使用console.log
。 :( - SidOfc如果您要在公共站点上使用它,任何具有使用开发人员工具的基本知识的人都可以阅读您的调试消息。根据您在记录什么,这可能不是一种理想的行为。
最好的方法之一是将console.log
包装在其中一个方法中,并可以检查条件并执行它。在生产构建中,您可以避免拥有这些功能。这个Stack Overflow问题详细介绍了如何使用闭包编译器做同样的事情。
因此,回答您的问题:
console.log
记录对象会导致内存泄漏,因为浏览器保留对象结构以允许开发人员展开日志。 - Shamasis Bhattacharyaconst 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 = function(){}
(该代码将禁用掉浏览器中的console.log函数) - br4nnigan性能影响将是最小的,但在旧版本浏览器中,如果用户的浏览器控制台未打开,则会导致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
我制作了这个jsPerf测试:http://jsperf.com/console-log1337
它似乎和其他函数调用一样不会花费更多时间。
如果有些浏览器没有控制台API怎么办? 如果你需要使用console.log进行调试,你可以在生产部署中包含一个脚本来覆盖控制台API,就像Paul在他的答案中建议的那样。
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
。
console.log
需要约50毫秒。 - Pedram marandi