Самая быстрая возможная сериализация объекта 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.
...
К сожалению, это не потоковый формат, а значит, вы должны предварительно обрабатывать свои данные в автономном режиме. Однако есть план для преобразования его в потоковый формат (проверьте вехи).