Javascript Node.js流写入循环

Javascript Node.js流写入循环,javascript,node.js,benchmarking,hhvm,jxcore,Javascript,Node.js,Benchmarking,Hhvm,Jxcore,最近我尝试对node.js的一些本机功能进行基准测试,发现了一些我无法理解的令人毛骨悚然的结果。下面是我测试的简单代码和测试结果: 您可以看到,它以每秒8553个请求的速度处理100k个请求,并发度为200。然后,一位朋友告诉我,在这种情况下,我不应该使用异步,因为这个循环不够大,无法阻止节点的事件循环,所以我重构了代码以使用for循环,从而使基准测试结果更高: 这里我们每秒有9174个请求。整洁的 (奇怪的是,即使我将迭代次数更改为10k,for循环版本也始终比异步版本快) 但我的朋友想知

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

您可以看到,它以每秒8553个请求的速度处理100k个请求,并发度为200。然后,一位朋友告诉我,在这种情况下,我不应该使用异步,因为这个循环不够大,无法阻止节点的事件循环,所以我重构了代码以使用for循环,从而使基准测试结果更高:

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

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

AAAA我们每秒有2860个请求。这里发生了什么事?为什么流式写作如此缓慢?我的代码中是否存在某种错误,或者节点实际上是如何处理流的

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

一开始,我还针对JXCore和HHVM(使用节点代码的async.js版本)测试了相同的代码,结果如下:得到了一个奇怪的结果:节点集群比最新的JXCore 2.3.2更快

任何批评都将不胜感激

EDIT:@Mscdex,我很好奇调用res.write()是否可能是问题所在,所以我改变了将数据推送到res使用的新流的方式。我天真地认为,也许这种方式节点会以某种方式有效地优化输出缓冲和流数据。虽然此解决方案也起作用,但速度甚至比以前慢:


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


在节点v0.12+中,“塞”功能,以便您可以根据需要执行
res.write()
操作,但您可以对流进行塞和解锁,以便所有这些写入操作只产生一个
write()
系统调用。这基本上就是你现在所做的输出连接,除了塞瓶可以为你做这件事。在node core的某些地方,这种塞码功能也可以在后台自动使用,这样您就不必显式地塞码/解码以获得良好的性能。

FYI使用async不会自动使代码异步。您的第一个基准测试比简单for循环慢,因为它本质上只是一个简单for循环,增加了异步库的开销。然而,这并不能解释为什么流媒体很糟糕。刚刚通过排水事件测试了背压检测,它仍然在2900转/秒左右。我之所以想使用stream,是因为它是streaming。我不想要一个write()系统调用,它不是流式的,而是一块一块地发送整个输出。我希望节点在从for循环获取输出时对其进行流式处理,而不是缓冲(因为我可以简单地将所有内容连接到一个变量中,只需使用res.end())并推送到客户机。