Почему JSON быстрее, чем BSON в node.js?

После прочтения этого, есть цитата, которая выделялась:

BSON также предназначен для быстрого кодирования и декодирования. Например, целые числа хранятся в виде 32 (или 64) битовых целых чисел, поэтому их не нужно анализировать и из текста. Это использует больше пространства, чем JSON для небольших целых чисел, , но намного быстрее для синтаксического анализа.

Из того, что я читаю, вся суть использования BSON заключается в том, что он меньше подвергает риску процессор и быстрее кодирует/обрабатывает.

Но, я провел несколько тестов с помощью 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 использовать дополнительное использование ЦП, поскольку оно не будет конвертироваться в UTF-8 с текстовыми веб-сайтами? Будет ли этот уровень производительности в этом отношении?

@Joe Clay ниже, вот только результаты для stringify и serializing:

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

Ответ 1

Вопрос не должен быть Почему JSON быстрее BSON?, но Почему JSON быстрее BSON в node.js?.

В большинстве сред двоичные кодировки, такие как BSON, MessagePack или CBOR, легче кодировать, чем текстовое кодирование JSON. Однако среды javascript (например, v8/ node.js) сильно оптимизированы для обработки JSON (потому что это подмножество javascript). JSON de/encoding, вероятно, реализована там в собственном коде оптимизированно непосредственно в JS VM. Однако виртуальные машины javascript не оптимизированы для представления и управления массивами байтов (которые используются библиотекой BSON). Собственный тип буфера Nodes может быть лучше, чем чистый массив JS, но работа с ним (и, например, расширение байтов JS string (UTF16) → UTF8 в JS) все еще медленнее, чем встроенная сериализация JSON.

В других языках, таких как С++ с прямым доступом к байтовому массиву и типам строк utf8, результаты могут быть совершенно разными.

Ответ 2

Я считаю, что Node.js и большинство браузеров являются исключением.

Простым ответом является JSON-синтаксический анализатор/сериализатор/десериализатор (т.е. V8), которые чрезвычайно оптимизированы и написаны на C/С++. Парсер BSON написан на JavaScript. Но даже если парсер написан на родном языке (и я считаю, что у BSON есть один), JSON по-прежнему будет выигрывать, учитывая, насколько оптимизирован V8 для JSON.

Если вы используете платформу вроде Java или С#, формат BSON, вероятно, будет быстрее.

См. @Matthais247, который ответил за мной, но гораздо более полностью.

Ответ 3

Я думаю, вы не можете судить о производительности только, глядя на сериализацию/десериализацию. Вы просто выбрали неверный прецедент для BSON. BSON светит в базах данных - где вы можете делать вычисления по данным без необходимости их сериализации. Кроме того, хранение и извлечение двоичных данных, таких как изображения, делает BSON более эффективным, поскольку вам не нужно кодировать данные как Hex/BASE64 или аналогичные.

Попробуйте выполнить некоторые вычисления, непосредственно получая/сохраняя значения в JSON и BSON. Но используйте произвольный доступ (не всегда один и тот же элемент), так что вероятность его оптимизации под капотом небольшая.