使用调试功能console.log
会降低JavaScript执行性能吗?它会影响生产环境中脚本执行的速度吗?
是否有一种方法可以从单个配置位置禁用生产环境中的控制台日志?
答案 0 :(得分:61)
实际上,console.log
比空函数慢得多。在我的Chrome 38上运行this jsPerf test可获得惊人的效果:
console.log
比调用空函数>> 如果您有一次合理数量的console.…
次呼叫,那么您不会注意到性能滞后(在我安装Chrome时需要2毫秒 - 或者在控制台打开时需要20毫秒)。但是,如果您反复将内容记录到控制台 - 例如,通过requestAnimationFrame
将其挂起 - 它可能会使事情变得棘手。
In this test我还检查了生产的自定义“隐藏日志”的想法 - 有一个保存日志消息的变量,可按需提供。结果是
console.log
答案 1 :(得分:49)
如果您要在公共站点或其他地方使用此功能,任何对使用开发人员工具知之甚少的人都可以阅读您的调试消息。根据您记录的内容,这可能不是理想的行为。
最好的方法之一是将console.log
包装在您的一个方法中,并在那里检查条件并执行它。在生产版本中,您可以避免使用这些功能。 Stack Overflow question详细讨论了如何使用Closure compiler进行相同操作。
所以,回答你的问题:
答案 2 :(得分:9)
如果您在通用核心脚本中创建控制台的快捷方式,例如:
var con = console;
然后在整个代码中使用con.log(“message”)或con.error(“错误消息”),在生产中你可以简单地将核心位置的con重新连接到:
var con = {
log: function() {},
error: function() {},
debug: function() {}
}
答案 3 :(得分:7)
const DEBUG = true / false
DEBUG && console.log('string')
答案 4 :(得分:5)
任何函数调用都会轻微降低性能。但是一些console.log
不应该有任何显着的效果。
但是,它会在不支持console
答案 5 :(得分:3)
性能影响很小,但在较旧的浏览器中,如果用户浏览器控制台未打开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/
答案 6 :(得分:2)
我做了这个jsPerf测试:http://jsperf.com/console-log1337
它似乎不需要比其他函数调用更长的时间。
没有控制台API的浏览器怎么样?如果您需要使用console.log进行调试,您可能会在生产部署中包含一个脚本来覆盖控制台API,就像Paul在答案中所建议的那样。
答案 7 :(得分:1)
将使用调试功能console.log减少JavaScript 执行性能?它会影响脚本执行的速度吗 生产环境?
当然,console.log()
会降低程序的性能,因为它需要大量的计算时间。
是否有一种方法可以在生产中禁用控制台日志 一个配置位置创建一个环境?
将此代码放在脚本的开头,以将标准console.log函数覆盖为空函数。
console.log = function () { };
答案 8 :(得分:1)
我这样做是为了维护控制台方法的原始签名。在一个公共位置,先于其他JS加载:
var DEBUG = false; // or true
然后遍历整个代码
if (DEBUG) console.log("message", obj, "etc");
if (DEBUG) console.warn("something is not right", obj, "etc");