Самая быстрая возможная сериализация объекта Javascript с помощью Google V8

Мне нужно сериализовать умеренно сложные объекты с 1-100 свойств смешанного типа.

Сначала использовался JSON, затем я переключился на BSON, который был немного быстрее.

Кодирование 10000 объектов-образцов

JSON:        1807mS
BSON:        1687mS
MessagePack: 2644mS (JS, modified for BinaryF)

Я хочу увеличить порядок; он оказывает смехотворно плохое воздействие на остальную часть системы.

Частью мотивации перехода на BSON является требование кодирования двоичных данных, поэтому JSON (сейчас) непригоден. И поскольку он просто пропускает двоичные данные, присутствующие в объектах, которые он "обманывает" в этих тестах.

Профилированные горячие точки производительности BSON

  • (неизбежное?) преобразование строк UTF16 V8 JS в UTF8.
  • malloc и string ops внутри библиотеки BSON

Кодер BSON основан на библиотеке Mongo BSON.

Собственный двоичный сериализатор V8 может быть замечательным, но поскольку JSON является родным и быстро сериализуется, я боюсь даже, что это может не дать ответ. Возможно, мой лучший выбор - оптимизировать грань библиотеки BSON или написать свой собственный плюс, чтобы получить более эффективный способ вытащить строки из V8. Одной тактикой может быть добавление поддержки UTF16 в BSON.

Итак, я здесь для идей и, возможно, проверка здравомыслия.

Edit

Добавлен тест MessagePack. Это было изменено с исходного JS для использования BinaryF.

Библиотека С++ MessagePack может предложить дополнительные улучшения, я могу сравнить ее по отдельности, чтобы сравнивать напрямую с библиотекой BSON.

Ответ 1

Для сериализации/десериализации protobuf довольно сложно обыграть. Я не знаю, можно ли отключить транспортный протокол. Но если вы можете протобуф, безусловно, следует учитывать.

Взгляните на все ответы на Буферы протокола по сравнению с JSON или BSON.

Принятый ответ выбирает thrift. Он, однако, медленнее протобуфа. Я подозреваю, что он был выбран для удобства использования (с Java), а не скорости. Эти тесты Java очень полезны.
Обратите внимание

  • MongoDB-BSON 45042
  • protobuf 6539
  • protostuff/protobuf 3318

Тесты - это Java, я бы предположил, что вы можете достичь скоростей около протостовой реализации protobuf, то есть в 13,5 раз быстрее. Худший случай (если по какой-то причине Java лучше всего подходит для сериализации), вы можете сделать не хуже обычную неоптимизированную реализацию protobuf, которая работает в 6,8 раза быстрее.

Ответ 2

Взгляните на MessagePack. Он совместим с JSON. Из документов:

Быстрая и компактная сериализация

MessagePack - это двоичный эффективная сериализация объектов библиотека. Он позволяет обмениваться структурированные объекты между многими такие языки, как JSON. Но, в отличие от JSON, это очень быстро и мало.

Типичное маленькое целое число (например, флаги или код ошибки) сохраняется только в 1 байт, и типичная короткая строка требует только 1 байта, за исключением длины строки сам. [1,2,3] (массив 3 элементов) сериализован в 4 байтах, используя MessagePack следующим образом:

Ответ 3

Если вас больше интересует скорость де-сериализации, просмотрите библиотеку JBB (Javascript Binary Bundles). Это быстрее, чем BSON или MsgPack.

Из Wiki, страница JBB vs BSON vs MsgPack:

...

  • JBB примерно на 70% быстрее, чем Binary-JSON (BSON) и примерно на 30% быстрее, чем MsgPack на скорости декодирования, даже с одним отрицательным тестовым случаем (# 3).
  • JBB создает файлы, которые (даже их сжатые версии) примерно на 61% меньше, чем Binary-JSON (BSON) и примерно на 55% меньше, чем MsgPack.

...

К сожалению, это не потоковый формат, а значит, вы должны предварительно обрабатывать свои данные в автономном режиме. Однако есть план для преобразования его в потоковый формат (проверьте вехи).