使用Oboe.js,MongoDB和Express.js进行JSON流式传输

时间:2014-11-01 00:00:47

标签: json node.js mongodb node.js-stream jsonstream

我正在尝试通过HTTP与Oboe.js,MongoDB和Express.js进行JSON流式传输。

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

我在MongoDB查询服务器端和客户端的JSON解析中比较了streamingblocking的基准。

以下是两个基准测试的源代码。 first number1000 queries 100 items 10 million documents collection(分页)中second number的毫秒数,括号内// 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); 代表毫秒数 - 解析MongoDB结果数组中第一个项之前的秒。

流媒体基准服务器端:

// 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);
});

阻止基准测试服务器端:

Streaming

这些结果让我感到惊讶,因为我会想到:

  1. blocking每次都会比Oboe.js更快。
  2. 与本机JSON.parse方法相比,
  3. Oboe.js可以更快地解析整个JSON数组。
  4. 与本机JSON.parse方法相比,
  5. 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); 可以更快地解析数组中的第一个元素。
  6. 有没有人有解释? 我做错了什么?

    以下是两个客户端基准测试的源代码。

    流媒体基准客户端:

    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);
    

    阻止基准客户端:

    {{1}}

    提前致谢!

1 个答案:

答案 0 :(得分:1)

我在Oboe doc的结尾处找到了这些评论" Why Oboe?"部分:

因为它是一个纯Javascript解析器,所以Oboe.js比JSON.parse需要更多的CPU时间。对于加载速度非常快的小消息,Oboe.js的工作速度稍慢,但对于大多数使用i / o的实际情况,Oboe.js有效地优化了CPU时间。 SAX解析器比Oboe基于模式的解析模型需要更少的内存,因为它们不会构建解析树。请参阅Oboe.js vs SAX vs DOM。 如果有疑问,那么不要忘记使用真正的互联网,包括移动设备,并考虑感性表现。