【发布时间】:2011-10-14 18:39:54
【问题描述】:
如果您的 Node.js 代码中充斥着 console.log 语句,您是否会引发性能问题?是否值得调试/生产切换它的开/关?我意识到日志记录通常对 prod 很重要 - 但我通常很好奇控制台输出是否会影响性能?
在 Chrome 中,如果控制台打开,它肯定会降低性能。
【问题讨论】:
标签: performance node.js console logging
如果您的 Node.js 代码中充斥着 console.log 语句,您是否会引发性能问题?是否值得调试/生产切换它的开/关?我意识到日志记录通常对 prod 很重要 - 但我通常很好奇控制台输出是否会影响性能?
在 Chrome 中,如果控制台打开,它肯定会降低性能。
【问题讨论】:
标签: performance node.js console logging
编辑:
console.log 是同步的,它阻塞了事件循环
我认为这是唾手可得的成果,当您禁用日志记录时(如果未在关键部分严格使用),几乎不会给您带来任何减速。可能console.log 是用纯C 实现的。还有一些可用的模块可以关闭生产中的日志记录,就像您可以使用socket.io 一样:
【讨论】:
GAMES 对象中的 60,000 个键对 console.log 进行了测试。然后,只需执行for in 来检查属性是否存在,同时控制台在检查之前记录 GAMES 对象。并且出现了明显的延迟。 (3-5 秒)我删除了控制台日志并再次重新检查了属性,它是即时的。这是一个巨大的问题,因为如果您在节点内部使用速率限制器,这种延迟会使您的系统非常脆弱。 (限制器在 io 完成之前无法正常运行(或任何代码),非常危险)。
console.log是同步的,它阻塞了事件循环。
nodejs 中的console.log 调用是同步的(!)并阻塞事件循环。当我使用 pg 记录执行(异步)sql 查询的结果时,我刚刚体验到了这一点。仅记录 20 个项目及其(少数)属性将我的本地计算机上的性能从 3 毫秒降低到 300 毫秒。
【讨论】:
如上所述,console.log 是异步且非阻塞的,因此除了函数调用的一个滴答声外,它不会使您的应用程序减慢太多。
但是在生产环境中部署时使用一些模块关闭某些级别的日志而不是直接使用console.log是一个好习惯。 @Alfred 列出了几个不错的。
Nodejs 官博发了一篇文章建议使用 JSON 格式进行日志记录,查看Service logging in JSON with Bunyan,Bunyan for nodejs 真的值得一试。
【讨论】:
console.log是同步的,它阻塞了事件循环
console.log 减慢了 chrome 的速度,因为它实际上在每次调用时都与 DOM 交互。整个inspect element 系统实际上只是大量的 DOM 元素。当您在浏览器中调用 console.log 时,它必须在每次调用时将新元素附加到 console。
您可以通过右键单击console 中的元素并单击inspect element 来查看console.log 是如何真正成为HTML 的。这实际上会打开一个新的console,检查一个已经存在的console。 :D
如果您真的很担心性能,您可以完全删除console.log 功能(不建议这样做,因为它可能会让人感到困惑)。您基本上可以在浏览器或服务器端使用noop 功能。没有更多的console.log 没有更多的速度影响:D
console.log=function(){};
【讨论】: