Node.js流写入循环
Node.js stream write in loop
我最近试图对node.js的一些本机功能进行基准测试,发现了一些我无法理解的令人毛骨悚然的结果。以下是我基准测试和基准测试结果的一个简单代码:
http://pastebin.com/0eeBGSV9
您可以看到,它在200个并发的10万个请求上每秒处理8553个请求。然后,一位朋友告诉我,在这种情况下,我不应该使用异步,因为这个循环不够大,无法阻碍节点的事件循环,所以我重构了代码以用于循环,它将基准测试结果提高得更高:
http://pastebin.com/0jgRPNEC
在这里,我们每秒有9174个请求。整洁的(即使我将迭代次数更改为10k,for循环版本也始终比异步版本快,这很奇怪)。
但后来我的朋友想知道,是否可以通过使用流媒体而不是在循环结束后转储所有数据来进一步推送这个结果。再次,我重构了代码,使用res.write来处理数据输出:
http://pastebin.com/wM0x5nh9
aaaaa我们每秒有2860个请求 这里发生了什么?为什么流式写作如此迟缓?我的代码中是否存在某种错误,或者节点实际上就是这样处理流的
ubuntu上的节点版本为0.10.25,默认设置来自apt安装。
一开始,我还针对JXCore和HHVM(使用async.js版本的节点代码)测试了相同的代码,结果如下:http://pastebin.com/6tuYGhYG得到了节点集群比最新的jxcore 2.3.2更快的奇怪结果。
任何批评都将不胜感激。
EDIT:@Mscdex,我很好奇调用res.write()是否是问题所在,所以我改变了将数据推送到一个供res使用的新流的方式。我天真地相信,也许这种方式的节点会以有效的方式优化输出缓冲和流数据。虽然这个解决方案也有效,但它比以前更慢:
http://pastebin.com/erF6YKS5
我的猜测是,拥有许多单独的write()
系统调用会带来开销。
在nodev0.12+中,添加了"corking"功能,这样您就可以随心所欲地执行res.write()
,但您可以对流进行cork和uncork操作,这样所有这些写入操作都只会导致一个write()
系统调用。这基本上就是您现在对输出的串联所做的,除了软木塞会为您做这件事。在节点核心的某些地方,这种软木塞功能也可以在后台自动使用,这样您就不必显式地软木塞/打开软木塞就能获得良好的性能。
- 合并两个数组,重新调整循环js
- JS(node.js)而循环不起作用
- 如何在Angular.js中循环动态添加Fields并获取数据并将其发送到服务器
- JS.循环遍历多维数组,以计数元素在每列中的出现次数
- 如何使用React JS中的循环,根据条件渲染或不渲染表数据
- 两个循环JS函数相互冲突
- 如何在文本字段中循环Js函数和事件
- 如何停止滑块在滑行中再次循环.js
- 循环 JS 变量不会在函数内显示正确的值
- 嵌套在 Node 中的循环.js与 Mocha 测试框架一起
- 在 Node 中连接数组循环.js glob 结果
- 循环 JS 函数,直到满足 if 或 else 条件
- 页面冻结,不要使用循环js移动wihle
- 循环JS中的信用更新
- 什么是循环JS中变量的良好命名形式
- 显示/隐藏循环js问题
- 如何在循环时使用mysql循环Js
- 如何填充数组循环JS
- 成为更多的OO多个For循环JS
- 如何嵌套循环通过关联数组内的索引数组循环(JS)