JSONstring直接从节点mongodb

我已经在一个简单的服务器上进行了一系列的负载testing,试图确定哪些负面影响了我的复杂的node / express / mongodb应用程序的负载。 其中一个常常出现的问题是string操作需要在快速响应中将内存中的对象转换为JSON。

我通过节点从mongodb获取的数据量和通过networking发送的数据量是〜200/300 KB(未压缩的)。 (Gzip会把这个变成28k,好多了。)

有没有办法让本地nodejs的mongodb驱动程序为我的结果stringify结果? 现在,对于标准.toArray()的每个请求,我们正在执行以下操作:

  1. 查询数据库,查找结果并将其传送到节点本地驱动程序
  2. 本地驱动程序然后把它们变成一个内存中的JavaScript对象
  3. 我的代码然后传递这个内存中的对象来表示
  4. Express然后将其转换为string节点的http response.send使用JSON.stringify()(我读的源卢克。)

我正在寻找在c ++ /本地层完成string化工作,以便它不会将处理时间添加到我的事件循环。 有什么build议么?

编辑1:

一个被certificate的瓶颈。

可能很容易有其他的事情可以优化,但这里是负载testing显示。

我们在几秒钟内发出了500次请求。 有了这个代码:

app.get("/api/blocks", function(req, res, next){ db.collection('items').find().limit(20).toArray(function(err, items){ if(err){ return next(err); } return res.send(200, items); }); }); 

总体平均值:323ms,95%

如果我换出json数据:

 var cached = "[{... "; //giant json blob that is a copy+paste of the response in above code. app.get("/api/blocks", function(req, res, next){ db.collection('items').find().limit(20).toArray(function(err, items){ if(err){ return next(err); } return res.send(200, cached); }); }); 

平均为164毫秒,第95位为580%

现在你可能会说:“天哪,323毫秒的意思是好的,你的问题是什么?” 我的问题是这是一个例子,其中stringify导致响应时间加倍。

从我的testing中,我也可以告诉你这些有用的东西:

  • Gzip在响应时间上是2倍或更好的收益。 以上是用gzip
  • 与通用nodejs相比,Express在开销上增加了几乎难以察觉的数量
  • 通过执行cursor.each来对数据进行批处理,然后将每个单独的项目发送给响应就更糟了

更新2:

使用概要分析工具: https : //github.com/baryshev/look这是一遍又一遍地在同一个数据库密集型过程中打印我的生产代码。 该请求包含一个mongodb聚合,并发回〜380KB数据(未压缩)。

过早优化我的脚!

该函数非常小,包括var body = JSON.stringify(obj, replacer, spaces); 线。

听起来你应该直接从Mongostream到Express。

根据这个问题,正是这个问题 :

 cursor.stream().pipe(JSONStream.stringify()).pipe(res);