javascript - Node.js 流写入循环

标签 javascript node.js benchmarking hhvm jxcore

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

http://pastebin.com/0eeBGSV9

您可以看到它在 200 个并发的 10 万个请求上每秒执行 8553 个正常请求。然后我被一个 friend 指示,我不应该在这种情况下使用异步,因为这个循环不够大,无法阻碍 Node 的事件循环,所以我重构了代码以使用 for 循环,它甚至增加了基准测试结果更高:

http://pastebin.com/0jgRPNEC

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

但是我的 friend 想知道是否可以通过使用流而不是在循环结束后转储所有数据来进一步插入这个结果。我再次重构代码以使用 res.write 来处理数据输出:

http://pastebin.com/wM0x5nh9

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 会以某种方式以某种方式优化输出缓冲和流数据。虽然此解决方案也有效,但它比以前更慢:

http://pastebin.com/erF6YKS5

最佳答案

我的猜测是有许多单独的 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/

相关文章:

java - 如何在jsp、java和js代码中处理连续页面刷新

javascript - 鼠标移动无法正常工作

javascript - Angular JS 自动更新事件 View

javascript - npm outdated 不尊重 package.json 的插入符号

javascript - 如何将 Mercurial 嵌入 rails 模板中

javascript - 当 Reducer 中的存储发生更改时,useSelector 不会更新。 ReactJS 终极版

node.js - Typescript 中每个类的单独文件?

rust - 如何在 Rust 中为 Criterion 基准创建随机输入

ruby-on-rails - 用于性能基准测试的 Rails gems/工具?

security - 如何对加密库进行基准测试?