我正在尝试通过HTTP与Oboe.js,MongoDB和Express.js进行JSON流式传输。
重点是在MongoDB
(Node.js的mongodb本机驱动器)中进行查询,将其(JavaScript数组)传递给Express.js
并使用Oboe.js
在浏览器中解析它
我在MongoDB查询服务器端和客户端的JSON解析中比较了streaming
与blocking
的基准。
以下是两个基准测试的源代码。 first number
是1000 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
这些结果让我感到惊讶,因为我会想到:
blocking
每次都会比Oboe.js
更快。JSON.parse
方法相比,Oboe.js
可以更快地解析整个JSON数组。JSON.parse
方法相比,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);
可以更快地解析数组中的第一个元素。有没有人有解释? 我做错了什么?
以下是两个客户端基准测试的源代码。
流媒体基准客户端:
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}}
提前致谢!
答案 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。 如果有疑问,那么不要忘记使用真正的互联网,包括移动设备,并考虑感性表现。