console.log会减lessJavaScript的执行性能吗?
将使用console.log
的debuggingfunction降低JavaScript的执行性能? 它会影响生产环境中脚本执行的速度吗?
有没有一种方法从一个configuration位置禁用生产环境中的控制台日志?
如果您打算在公共站点上使用这些工具,那么任何对使用开发人员工具知之甚less的人都可以阅读您的debugging信息。 根据你所logging的内容,这可能不是一个理想的行为。
最好的方法之一是将console.log
包装在你的一个方法中,并在那里你可以检查条件并执行它。 在生产版本中,您可以避免使用这些function。 这个堆栈溢出问题详细讨论了如何使用Closure编译器做同样的事情。
所以,要回答你的问题:
- 是的,它会降低速度,尽pipe只是可以忽略不计。
- 但是,不要使用它,因为一个人读取日志太容易了。
- 这个问题的答案可能会给你提示如何从生产中删除它们。
实际上, console.log
比一个空的函数要慢很多。 在我的Chrome 38上运行这个jsPerftesting可以获得惊人的结果:
- 当浏览器控制台closures时,调用
console.log
比调用一个空函数慢大约10 000倍 , - 而当控制台打开的时候,调用它比慢10万倍 。
如果你有一个合理的console.…
数量,那么你不会注意到性能滞后console.…
一次触发(一百次会在我安装的Chrome上花费2毫秒 – 或者在控制台打开时花费20毫秒)。 但是,如果你重复login到控制台 – 例如,通过requestAnimationFrame
挂钩 – 它可以让事情变得更加激动人心。
更新:
在这个testing中,我也检查了生产的定制“隐藏日志”的想法 – 有一个variables持有日志消息,可根据需要提供。 事实certificate是
- 大约比原生
console.log
快1000倍 , - 如果用户打开控制台,显然要快10000倍。
如果您在公共核心脚本中创build控制台的快捷方式,例如:
var con = console;
然后在整个代码中使用con.log(“message”)或con.error(“error message”),在生产中,您可以简单地将核心位置中的con连接到:
var con = { log: function() {}, error: function() {}, debug: function() {} }
任何函数调用都会稍微降低性能。 但是一些console.log
应该不会有什么明显的影响。
但是,它会在不支持console
旧浏览器中引发未定义的错误
我做了这个jsPerftesting: http ://jsperf.com/console-log1337
似乎没有比其他函数调用更长的时间。
那些没有控制台API的浏览器呢? 如果您需要使用console.log进行debugging,则可以在生产部署中包含脚本来覆盖控制台API,就像Paul在答案中所build议的那样。
const DEBUG = true / false DEBUG && console.log('string')
性能命中将是最小的,但是在旧版浏览器中,如果用户浏览器控制台未打开,则会导致JavaScript错误log is not a function of undefined
。 这意味着console.log调用之后的所有JavaScript代码将不会执行。
你可以创build一个包装来检查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/