使用调试功能会console.log
降低JavaScript执行性能吗?它会影响生产环境中脚本执行的速度吗?
有没有一种方法可以从单个配置位置禁用生产环境中的控制台日志?
console.log
采用50ms的〜
使用调试功能会console.log
降低JavaScript执行性能吗?它会影响生产环境中脚本执行的速度吗?
有没有一种方法可以从单个配置位置禁用生产环境中的控制台日志?
console.log
采用50ms的〜
Answers:
如果要在公共场所或其他地方使用此工具,则对使用开发人员工具不了解的任何人都可以阅读您的调试消息。根据您要记录的内容,这可能不是理想的行为。
最好的方法之一是将console.log
in 包装为您的方法之一,然后您可以在其中检查条件并执行它。在生产版本中,可以避免具有这些功能。这个Stack Overflow问题详细讨论了如何使用Closure编译器执行相同的操作。
因此,回答您的问题:
conosle.log
将仍然击中了重写功能,不是吗?
console.log
用于记录对象的确会导致内存泄漏,因为浏览器保留了对象结构以允许开发人员扩展日志。
实际上,console.log
它比空函数要慢很多。在我的Chrome 38上运行此jsPerf测试可得到惊人的结果:
console.log
是慢大约10万次比调用空函数,并不是说,如果您console.…
触发一次合理数量的呼叫(在我安装的Chrome上,一百将花费2毫秒,而在控制台打开时将花费20毫秒),您会注意到性能下降。但是,如果您反复将内容登录到控制台(例如,将其挂接)requestAnimationFrame
,则会使事情变得混乱。
在此测试中,我还检查了用于生产的自定义“隐藏日志”的想法-具有一个变量,该变量包含按需提供的日志消息。原来是
console.log
,console.log
。它们都是产生副作用的功能。
console.log
除非您将其绑定到滚动/调整大小处理程序,否则它本身并不会真正以您会注意到的方式影响性能。这些被称为很多,如果您的浏览器必须以每秒30 / 60x的速度向控制台发送文本,则可能会很丑陋。然后就是那个IE错误,根本不允许您console.log
在关闭控制台的情况下进行操作:(
logging-on x 3,179 ops/sec ±2.07% (56 runs sampled)
logging-off x 56,058,330 ops/sec ±2.87% (56 runs sampled)
logging-off-stringify x 1,812,379 ops/sec ±3.50% (58 runs sampled)
log-nothing x 59,509,998 ops/sec ±2.63% (59 runs sampled)
使用调试功能console.log会降低JavaScript执行性能吗?它会影响生产环境中脚本执行的速度吗?
当然,这console.log()
会降低程序的性能,因为它需要大量的计算时间。
有没有一种方法可以从单个配置位置禁用生产环境中的控制台日志?
将此代码放在脚本的开头,以将标准console.log函数重写为空函数。
console.log = function () { };
性能下降将是最小的,但是在旧版浏览器中,如果未打开用户浏览器控制台,则会导致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在他的回答中建议的那样。