为什么JSON比BSON更快?

阅读完这篇文章后 ,有一个引人注目的话:

BSON也被devise为快速编码和解码。 例如,整数存储为32(或64)位整数,所以它们不需要从文本中parsing出来。 这对于小整数使用比JSON更多的空间, 但parsing起来要快得多

从我正在阅读的内容来看,使用BSON的全部重点是因为它对CPU的征税较less,编码/处理速度更快。

但是,我使用Node.js做了一些testing,并使用本机JSON方法将BSON吹出水面。 一些testing显示JSON速度快了3到5倍。 (当使用更多的数据types时,大约在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完美地完成了这个任务,但是在看基准testing结果的时候,如果对串行化/反序列化对象花费更长时间,BSON如何减less对CPU的征税?

BSON是否弥补了它所使用的额外的CPU使用量,因为没有使用基于文本的 websocket转换为UTF-8? 这会平衡这方面的performance吗?

@Joe粘土在下面,这里只是stringifyserializing的结果:

 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 de / encoding可能直接在JS VM中以优化的方式在本地代码中实现。 然而,JavaScript虚拟机并不是针对表示和操作字节数组(使用BSON库)而优化的。 节点本地缓冲区types可能比纯JS数组好,但是使用它(例如JS中的JSstring(UTF16) – > UTF8字节解码)仍然比内置的JSON序列化慢。

在使用直接字节数组访问和utf8stringtypes的C ++等其他语言中,结果可能完全不同。

我相信Node.js和大多数浏览器是例外。

简单的答案是JSONparsing器/序列化器/解串器(即V8)非常优化,并用C / C ++编写。 BSONparsing器是用JavaScript编写的。 但即使parsing器是本地编写的(我相信BSON有一个),JSON仍然可能赢得了如何优化V8是为JSON。

如果您使用Java或C#等平台,BSON格式可能会更快。

请参阅@Matthais247,他回答完我之后,但更彻底。

我认为你不能仅仅通过序列化/反序列化来判断性能。 你只是为BSONselect了错误的用例。 BSON闪耀在数据库中 – 您可以在数据库上进行计算,而不需要序列化它们。 此外,存储和检索二进制数据(如图像)使BSON更加高效,因为您不需要将数据编码为Hex / BASE64或类似数据。

尝试做一些计算直接检索/存储在JSON和BSON的值。 但是使用随机访问(并不总是相同的项目),所以在引擎盖下优化的机会很小。