为什么JSON比BSON快?

时间:2016-04-21 10:48:48

标签: json node.js websocket bson

阅读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,以下是stringifyserializing的结果:

Run #1:
              JSON: 922 ms
              Bson: 355 5ms

3 个答案:

答案 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中的值进行一些计算。但是使用随机访问(并不总是相同的项目),因此它在引擎盖下优化的可能性很小。