阅读this之后,有一句引人注目:
BSON还可以快速编码和解码。例如,整数存储为32(或64)位整数,因此不需要对文本进行解析。对于小整数,这使用比JSON更多的空间,但解析的速度要快得多。
从我正在阅读的内容来看,使用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
话虽如此,我正在寻找通过websockets发送和接收数据的二进制方法。 BSON完美地做到了这一点,但是,在查看基准测试结果时,当序列化/反序列化对象需要更长时间时,BSON如何减少对CPU的负担?
BSON是否弥补了它使用的额外CPU使用率,因为没有使用基于文本的 websockets转换为UTF-8?这会在这方面达到平衡吗?
下面是@Joe Clay,以下是stringify
和serializing
的结果:
Run #1:
JSON: 922 ms
Bson: 355 5ms
答案 0 :(得分:17)
问题不应该是为什么JSON比BSON更快?但为什么JSON比node.js中的BSON更快?。
在大多数环境中,像BSON,MessagePack或CBOR这样的二进制编码比文本JSON编码更容易编码。然而,javascript环境(如v8 / node.js)针对JSON处理进行了大量优化(因为它是javascript的一个子集)。 JSON de / encoding可能直接在JS VM中以优化方式在本机代码中实现。然而,javascript VM并未针对表示和操作字节数组(由BSON库使用)进行优化。节点本机缓冲区类型可能比纯JS数组更好,但使用它(并在JS中执行JS字符串(UTF16) - > UTF8字节解码)仍然比内置的JSON序列化慢。
在其他语言中,如直接字节数组访问的C ++和utf8字符串类型,结果可能完全不同。
答案 1 :(得分:2)
我相信Node.js和大多数浏览器都是例外。
简单的答案是JSON解析器/串行器/解串器(即V8)经过极大优化,并且是用C / C ++编写的。 BSON解析器是用JavaScript编写的。但即使解析器是本机编写的(我相信BSON有一个),JSON仍然可能会获胜,因为优化的V8是针对JSON的。
如果你使用像Java或C#这样的平台,BSON格式可能会更快。
见@ Matthais247谁回答了我,但更完整。
答案 2 :(得分:1)
我认为只有通过查看序列化/反序列化才能判断性能。您只是为BSON选择了错误的用例。 BSON闪耀在数据库中 - 您可以在其中对数据进行计算,而无需对其进行序列化。同时存储和检索二进制数据(如图像)可以提高BSON的效率,因为您不需要将数据编码为Hex / BASE64或类似数据。
尝试直接检索/存储JSON和BSON中的值进行一些计算。但是使用随机访问(并不总是相同的项目),因此它在引擎盖下优化的可能性很小。