我最近尝试对一些 node.js 原生功能进行基准测试,发现了一些我无法理解的令人毛骨悚然的结果。这是我进行基准测试和基准测试结果的简单代码:
您可以看到它在 200 个并发的 10 万个请求上每秒执行 8553 个正常请求。然后我被一个 friend 指示,我不应该在这种情况下使用异步,因为这个循环不够大,无法阻碍 Node 的事件循环,所以我重构了代码以使用 for 循环,它甚至增加了基准测试结果更高:
这里我们每秒有 9174 个请求。整洁的。 (奇怪的是,即使我将迭代次数更改为 10k,for 循环版本始终比异步版本快)。
但是我的 friend 想知道是否可以通过使用流而不是在循环结束后转储所有数据来进一步插入这个结果。我再次重构代码以使用 res.write 来处理数据输出:
aaaa 我们每秒有 2860 个请求。 这里发生了什么?为什么流写入如此缓慢?我的代码中是否存在某种错误,或者 Node 实际上是这样处理流的?
ubuntu 上的 Node 版本是 0.10.25,默认设置来自 apt 安装。
我还在一开始针对 JXCore 和 HHVM(使用 Node 代码的 async.js 版本)测试了相同的代码,结果如下:http://pastebin.com/6tuYGhYG并得到 Node 集群比最新的 jxcore 2.3.2 更快的奇怪结果。
任何批评将不胜感激。
编辑:@Mscdex,我很好奇调用 res.write() 是否可能是问题所在,所以我更改了将数据推送到新流以供 res 使用的方式。我天真地相信,也许 Node 会以某种方式以某种方式优化输出缓冲和流数据。虽然此解决方案也有效,但它比以前更慢:
最佳答案
我的猜测是有许多单独的 write()
系统调用所涉及的开销。
在 Node v0.12+ 中,“corking”功能 has been added这样您就可以随心所欲地执行 res.write()
,但是您可以塞住和打开流,以便所有这些写入只会导致单个 write()
系统调用。这基本上就是您现在在连接输出时正在做的事情,只是 corking 会为您做这件事。在 Node 核心的某些地方,这种 corking 功能也可能会在幕后自动使用,这样您就不必显式地 cork/uncork 来获得良好的性能。
关于javascript - Node.js 流写入循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25794414/