Почему 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. Но используйте произвольный доступ (не всегда один и тот же элемент), так что вероятность его оптимизации под капотом небольшая.