首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Oboe.js、MongoDB和Express.js的JSON流

使用Oboe.js、MongoDB和Express.js的JSON流
EN

Stack Overflow用户
提问于 2014-11-01 00:00:47
回答 1查看 1.4K关注 0票数 2

我正在尝试使用Oboe.js、MongoDB和Express.js通过HTTP进行JSON流。

重点是在MongoDB (Node.js的mongodb本机驱动器)中执行查询,将其( JavaScript数组)输送到Express.js,并在浏览器中使用Oboe.js解析它。

我所做的基准测试将streamingblocking在MongoDB查询服务器端和客户机端的JSON解析进行了比较。

以下是这两个基准测试的源代码。first number1000 queries of 100 items (分页)在10 million documents collection中的毫秒数和括号之间的second number,表示在解析MongoDB结果数组中的第一个项之前的毫秒数。

流基准服务器端:

代码语言:javascript
复制
// Oboe.js - 20238 (16.887)
// Native - 16703 (16.69)

collection
.find()
.skip(+req.query.offset)
.limit(+req.query.limit)
.stream()
.pipe(JSONStream.stringify())
.pipe(res);

阻塞基准服务器端:

代码语言:javascript
复制
// Oboe.js - 17418 (14.267)
// Native - 13706 (13.698)

collection
.find()
.skip(+req.query.offset)
.limit(+req.query.limit)
.toArray(function (e, docs) {
    res.json(docs);
});

这些结果真让我吃惊,因为我会想:

  1. 每次Streaming都比blocking快。
  2. 与本机Oboe.js方法相比,Oboe.js将更快地解析整个JSON数组。
  3. 与本机Oboe.js方法相比,Oboe.js将更快地解析数组中的第一个元素。

有人能解释一下吗?我做错什么了?

这也是两个客户端基准测试的源代码。

流基准客户端:

代码语言:javascript
复制
var limit = 100;
var max = 1000;

var oboeFirstTimes = [];
var oboeStart = Date.now();

function paginate (i, offset, limit) {
    if (i === max) {
        console.log('> OBOE.js time:', (Date.now() - oboeStart));
        console.log('> OBOE.js avg. first time:', (
            oboeFirstTimes.reduce(function (total, time) {
                return total + time;
            }, 0) / max
        ));
        return true;
    }

    var parseStart = Date.now();
    var first = true;
    oboe('/api/spdy-stream?offset=' + offset + '&limit=' + limit)
    .node('![*]', function () {
        if (first) {
            first = false;
            oboeFirstTimes.push(Date.now() - parseStart);
        }
    })
    .done(function () {
        paginate(i + 1, offset + limit, limit);
    });
}

paginate(0, 0, limit);

阻塞基准客户端:

代码语言:javascript
复制
var limit = 100;
var max = 1000;

var nativeFirstTimes = [];
var nativeStart = Date.now();

function paginate (i, offset, limit) {
    if (i === max) {
        console.log('> NATIVE time:', (Date.now() - nativeStart));
        console.log('> NATIVE avg. first time:', (
            nativeFirstTimes.reduce(function (total, time) {
                return total + time;
            }, 0) / max
        ));
        return true;
    }

    var parseStart = Date.now();
    var first = true;

    var req = new XMLHttpRequest();
    req.open('GET', '/api/spdy-stream?offset=' + offset + '&limit=' + limit, true);

    req.onload = function () {
        var json = JSON.parse(req.responseText);
        json.forEach(function () {
            if (first) {
                first = false;
                nativeFirstTimes.push(Date.now() - parseStart);
            }
        });
        paginate(i + 1, offset + limit, limit);
    };

    req.send();
}

paginate(0, 0, limit);

提前谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-09-26 21:54:43

我在“为什么是双簧管”结尾的双簧管文档中找到了这些评论。一节:

因为它是一个纯Javascript解析器,所以Oboe.js比JSON.parse需要更多的CPU时间。对于加载速度非常快的小消息,Oboe.js的工作速度稍微慢一些,但对于大多数实际情况下,使用i/o有效地优于优化CPU时间。与基于模式的解析模型相比,SAX解析器需要更少的内存,因为它们没有构建解析树。参见Oboe.js对SAX和DOM。如果怀疑,基准,但不要忘记使用真正的互联网,包括移动,并考虑知觉性能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26685022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档