json - 为什么在 node.js 中 JSON 比 BSON 快?

标签 json node.js websocket bson

看完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 下面是 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 解码/编码可能直接在 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/

相关文章:

node.js - API网关-验证请求参数

python - 使用 asyncio 使 websocket 回调异步

node.js - Node.js 中子进程之间的通信

java - @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) 不适用于微服务上下文

android - 如何通过 GSON/Retrofit 获取值?

json - 使用 ARM 模板创建 NIC 时如何引用另一个虚拟网络/资源组的子网

node.js - 如何在 Node.js 中从模块中获取变量 - 出现语法错误

需要 python websockets 消费者和生产者示例

python - 区分多个 Websocket

javascript - 使用递归创建动态嵌套的 json 对象