3

我最近尝试对一些 node.js 原生功能进行基准测试,发现了一些我无法理解的令人毛骨悚然的结果。这是我基准测试和基准测试结果的简单代码:

http://pastebin.com/0eeBGSV9

您可以看到它在 200 个并发的 100k 个请求上每秒执行 8553 个健康请求。然后我被一个朋友指示,在这种情况下我不应该使用异步,因为这个循环不足以阻止节点的事件循环,所以我重构了代码以使用 for 循环,它甚至增加了基准测试结果更高:

http://pastebin.com/0jgRPNEC

这里我们每秒有 9174 个请求。整洁的。(即使我将迭代次数更改为 10k,for 循环版本也始终比异步版本快,这很奇怪)。

但是后来我的朋友徘徊,如果这个结果可以通过使用流而不是在循环完成后转储所有数据来进一步推动。我再次重构代码以使用 res.write 来处理数据输出:

http://pastebin.com/wM0x5nh9

aaaa 我们每秒有 2860 个请求。这里发生了什么?为什么流式写入如此缓慢?我的代码中是否存在某种错误,或者这是节点实际与流一起工作的方式?

ubuntu 上的节点版本为 0.10.25,默认设置来自 apt 安装。

我还在开始时针对 JXCore 和 HHVM(使用 async.js 版本的节点代码)测试了相同的代码,结果如下:http: //pastebin.com/6tuYGhYG并得到了一个奇怪的结果,即节点集群比最新的 jxcore 2.3 更快.2.

任何批评将不胜感激。

编辑:@Mscdex,我很好奇调用 res.write() 是否可能是问题所在,所以我改变了将数据推送到新流以供 res 使用的方式。我天真地相信,也许这种方式节点会以某种有效的方式优化输出缓冲和流数据。虽然这个解决方案也有效,但它比以前更慢:

http://pastebin.com/erF6YKS5

4

1 回答 1

1

我的猜测是拥有许多单独的write()系统调用所涉及的开销。

在节点 v0.12+ 中,添加了“corking”功能,以便您可以res.write()随心所欲地做任何事情,但您可以对流进行软木塞和解封,以便所有这些写入只导致一个write()系统调用。这基本上就是您现在通过输出连接所做的事情,除了软木塞会为您做这件事。在节点核心的某些地方,这种软木塞功能也可以在幕后自动使用,这样您就不必显式地软木塞/开塞来获得良好的性能。

于 2014-09-11T20:02:29.313 回答