看完this ,有一句话很突出:
BSON is also designed to be fast to encode and decode. For example, integers are stored as 32 (or 64) bit integers, so they don't need to be parsed to and from text. This uses more space than JSON for small integers, but is much faster to parse.
根据我的阅读,使用 BSON 的全部意义在于它对 CPU 的负担更少,编码/处理速度更快。
但是,我使用 Node.js 进行了一些测试,并使用原生 JSON 方法来打击 BSON出水。一些测试显示 JSON 大约快 3 到 5 倍。 (使用更多数据类型时大约为 6 到 8 个。)
基准代码:
var bson = require('bson');
var BSON = new bson.BSONPure.BSON();
var os = require('os');
console.log(" OS: " + os.type() + " " + os.release() + " (" + os.arch() + ")");
console.log("RAM: " + os.totalmem() / 1048576 + " MB (total), " + os.freemem() / 1048576 + " MB (free)");
console.log("CPU: " + os.cpus()[0].speed + " MHz " + os.cpus()[0].model);
for (var r = 1; r < 4; r++) {
console.log("\nRun #" + r + ":");
var obj = {
'abcdef': 1,
'qqq': 13,
'19': [1, 2, 3, 4]
};
var start = Date.now();
for (var i = 0; i < 500000; i++) {
JSON.parse(JSON.stringify(obj));
}
var stop = Date.now();
console.log("\t JSON: " + (stop - start) + " ms");
start = Date.now();
for (var i = 0; i < 500000; i++) {
BSON.deserialize(BSON.serialize(obj));
}
stop = Date.now();
console.log("\t Bson: " + (stop - start) + " ms");
}
结果:
OS: Windows_NT 6.1.7601 (x64)
RAM: 8174.1171875 MB (total), 5105.03515625 MB (free)
CPU: 3515 MHz AMD FX(tm)-6300 Six-Core Processor
Run #1:
JSON: 1820 ms
Bson: 8639 ms
Run #2:
JSON: 1890 ms
Bson: 8627 ms
Run #3:
JSON: 1882 ms
Bson: 8692 ms
话虽如此,我正在寻找一种通过 websocket 发送和接收数据的二进制方法。 BSON 完美地做到了这一点,但是,在查看基准测试结果时,当序列化/反序列化对象需要更长的时间时,BSON 如何减少对 CPU 的负担?
BSON 是否弥补了它使用的额外 CPU 使用量,因为不会使用 基于文本的 websockets 转换为 UTF-8?这会拉平这方面的表现吗?
@Joe Clay 下面是 stringify
和 serializing
的结果:
Run #1:
JSON: 922 ms
Bson: 355 5ms
最佳答案
问题不应该是为什么 JSON 比 BSON 快?,而是 为什么 JSON 在 node.js 中比 BSON 快?。
在大多数环境中,BSON、MessagePack 或 CBOR 等二进制编码比文本 JSON 编码更容易编码。然而,javascript 环境(如 v8/node.js)针对 JSON 处理进行了高度优化(因为它是 javascript 的子集)。 JSON 解码/编码可能直接在 JS VM 中以优化方式在 native 代码中实现。然而,javascript VM 并未针对表示和操作字节数组(由 BSON 库使用)进行优化。 Nodes native Buffer 类型可能比纯 JS 数组更好,但使用它(例如在 JS 中执行 JS 字符串 (UTF16) -> UTF8 字节解码)仍然比内置的 JSON 序列化慢。
在其他语言中,如 C++ 直接字节数组访问和 utf8 字符串类型,结果可能完全不同。
关于json - 为什么在 node.js 中 JSON 比 BSON 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36767310/