Самая быстрая сериализация объектов Javascript с помощью Google V8 - PullRequest
14 голосов
/ 02 июня 2011

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

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

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

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

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

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

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

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

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

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

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

Редактировать

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

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

Ответы [ 3 ]

5 голосов
/ 15 июня 2011

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

Посмотрите на все ответы на Протокол буфера против JSON или BSON .

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

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

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

3 голосов
/ 03 июня 2011

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

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

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

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

1 голос
/ 26 июля 2016

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

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

...

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

...

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

...