当前位置: 首页 > 面试题库 >

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

韩喜
2023-03-14
问题内容

阅读此内容后,引人注目:

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

话虽如此,我正在寻找一种通过websocket发送和接收数据的二进制方法。而且BSON可以完美地做到这一点,但是,当查看基准测试结果时,当序列化/反序列化对象花费更长的时间时,BSON如何减轻CPU的负担?

BSON是否可以弥补使用的额外CPU使用量,因为 基于文本的 WebSocket 不会转换为UTF-8 ?那会提高这方面的表现吗?

下面@Joe粘土,这里是结果stringifyserializing唯一:

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

问题答案:

问题不应该 是JSON为什么比BSON快? 但是 为什么在node.js中JSON比BSON更快?

在大多数环境中,二进制编码(如BSON,MessagePack或CBOR)比文本JSON编码更容易编码。但是,javascript环境(如v8 /node.js)已针对JSON处理进行了优化(因为它是javascript的子集)。JSON解/编码可能直接在JSVM中以优化的方式在本地代码中实现。但是,javascriptVM并未针对表示和操作字节数组(由BSON库使用)进行优化。节点的本机Buffer类型可能比纯JS数组更好,但是使用它(例如在JS中执行JS字符串(UTF16)->UTF8字节解码)仍然比内置JSON序列化慢。

在其他具有直接字节数组访问权限和utf8字符串类型的C ++语言中,结果可能完全不同。



 类似资料:
  • 问题内容: 我正在比较JSON和BSON用于序列化对象。这些对象包含多个大量整数的数组。在我的测试中,我要序列化的对象包含大约12,000个整数的总数。我只对序列化结果的大小比较感兴趣。我正在使用JSON.NET作为进行序列化的库。我使用JSON是因为我也希望能够在Javascript中使用它。 JSON字符串的大小约为43kb,BSON结果的大小为161kb。差异因子约为4。这不是我所期望的,因

  • 我刚刚开始使用MongoDB,我注意到它使用BSON在内部存储数据。然而,关于什么是BSON以及如何在MongoDB中使用BSON,文档并不十分清楚。有人能给我解释一下吗?

  • 问题内容: 为什么我的C ++插件中的Google V8 JavaScript引擎比Node.JS的运行速度明显慢? 我试图编写一些愚蠢的简单代码来在JavaScript中生成素数,并通过C ++插件在V8中直接在Node.JS中运行它。 我很震惊,因为两个都应该使用相同的JavaScript引擎并且都执行了相同的代码(时间以毫秒为单位,时间越短越好): 这是运行相同JavaScript代码的Ja

  • 问题内容: 我试图理解 为什么Java的ArrayDeque比Java的LinkedList更好, 因为它们都实现了Deque接口。 我几乎看不到有人在他们的代码中使用ArrayDeque。如果有人对ArrayDeque的实现方式有了更多的了解,那将是有帮助的。 如果我理解它,我会更自信地使用它。对于JDK实现管理头和尾引用的方式,我不清楚。 问题答案: 链接结构可能是最糟糕的结构,要在每个元素上

  • 问题内容: 我目前正在开始新的应用开发。应用程序设计师坚持认为我们使用 JBoss5 是因为它“更好”。是否有人对“更好”有更广泛的定义(如果如此)? 我有在具有大量用户负载的大规模应用程序中使用 Tomcat5 和6的经验,并且它处理得很好(IMHO)。两者都将在相同的硬件条件下(如果实现很重要)在 RedHat6 上运行。 提前致谢 问题答案: 说任何工具或框架都只是“更好”是可笑的。它总是取

  • 问题内容: 我可以在网上(在Stack Overflow上以及其他方面)找到大量有关使用Python或在Python中进行连接是一种非常低效且不好的做法的信息。 我似乎找不到为什么效率如此低下。在这里没有提到“在某些情况下已针对20%的改进进行了优化”(仍然不清楚这些情况是什么),我找不到任何其他信息。 在比其他Python串联方法更好的技术水平上发生了什么? 问题答案: 假设您有这段代码可以从三