Node.js控制台日志输出性能

36

如果你的 Node.js 代码中充斥着 console.log 语句,那么你是否会引发性能问题?是否值得在调试/生产之间切换开关?我意识到日志记录在生产中很重要 - 但我通常很好奇控制台输出会对性能产生影响吗?

在 Chrome 中,如果控制台打开,则明显会降低性能。

4个回答

25

在Nodejs中,console.log调用是同步的,并会阻塞事件循环。我刚刚通过记录使用pg执行的(异步)SQL查询结果来体验到了这一点。仅记录20个项目及其(少量)属性就将本地机器上的性能从3ms降至300ms。


24

@Raynos,这样更好,但仍然使用库来设置日志级别会很方便。 - Alfred
1
@Raynos 错了。它会极大地影响性能。我刚刚测试了一下,在我的“GAMES”对象中使用console.log记录了60,000个键,然后只是使用了一个for in来检查属性是否存在,并在检查之前记录了GAMES对象的console日志。结果出现了明显的延迟。(3-5秒) 我删除了console日志并重新检查了属性,这时速度瞬间就变快了。这是一个巨大的问题,因为这种延迟会使您的系统非常容易受到攻击,如果您在node内部使用速率限制器,则会非常危险(限制器将无法正常运行(或任何代码),直到io完成)。 - NiCk Newman
1
请注意,console.log同步的,它会阻塞事件循环。 - NoNameProvided
嗯,产品可能是最需要日志的环境... - Gershom Maes

12

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(){};

3
谢谢回答,我投了赞成票,但选择了@Alfred的答案,因为它特别针对node进行了回答。不过,关于Chrome以及为什么会有差异的信息也很有用。 - j03m
(至少在工作中速度较慢的计算机上)一旦将>1000个项目记录到日志中,Chrome问题就非常明显。但只有在打开开发工具时才会减慢速度,因此对于大多数用户来说,在生产中不应该是一个问题。 - Simon
@UpTheCreek 它仍然是同步的。 - Lime
有没有客户端库可以使用,并且与控制台日志相比提供更好的性能呢? - TGW
@TGW,你可以简单地将值附加到一个变量上,然后使用setTimeout定期显示它。 - Lime

-9
如上所述,console.log 是异步且非阻塞的,因此它不会太多地拖慢您的应用程序,除了函数调用需要一个tick。
但是最好养成一种习惯,在部署到生产环境时使用一些模块将某些级别的日志关闭,而不是直接使用 console.log。@Alfred 列出了几个很好的模块。
Nodejs 官方博客发布了一篇文章建议使用 JSON 格式记录日志,请查看 Service logging in JSON with BunyanBunyan for nodejs 真的值得尝试。

12
请注意,console.log同步的,它会阻塞事件循环。 - NoNameProvided

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接