使用调试特性 console.log会降低 JavaScript 的执行性能吗?它会影响生产环境中脚本执行的速度吗?
console.log
是否有一种从单个配置位置禁用生产环境中的控制台日志的方法?
对性能的影响将是最小的,但是在较老的浏览器中,如果用户浏览器控制台没有打开 log is not a function of undefined,就会导致 JavaScript 错误。这意味着在 console.log 调用之后所有的 JavaScript 代码将不会执行。
log is not a function of undefined
您可以创建一个包装器来检查 window.console是否是一个有效的对象,然后在包装器中调用 console.log。这种简单的方法可行:
window.console
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的老浏览器中抛出未定义的错误
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封装在您的一个方法中,并在其中检查条件并执行它。在生产构建中,可以避免使用这些函数。这个 堆栈溢出问题详细介绍了如何使用 闭包编译器来做同样的事情。
回答你们的问题:
实际上,console.log比一个空函数慢得多。在我的 Chrome 38上运行 这个 jsPerf 测试会得到惊人的结果:
并不是说你会注意到性能延迟,如果你有一个合理的数量 console.…调用触发一次(100将采取2毫秒在我的安装 Chrome-或20毫秒时,控制台打开)。但是如果你重复地把东西记录到控制台上——例如,通过 requestAnimationFrame连接到控制台上——它会让事情变得很糟糕。
console.…
requestAnimationFrame
在这个测试 中,我还检查了用于生产的自定义“隐藏日志”的想法——有一个保存日志消息的变量,可以根据需要使用。结果是
const DEBUG = true / false DEBUG && console.log('string')
将使用调试特性 console.log reduce JavaScript 执行性能? 它是否会影响 生产环境?
当然,console.log()会降低程序的性能,因为它需要计算时间。
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");