Рубрики
Без рубрики

Mashpack – бьющийся GessPack в своей собственной игре

MashPack – это формат сериализации JSON-объекта, вдохновленный MessagePack, настраиваемый для лучшего сжатия для некоторых объектов. Теги с Python, Showdev, MessagePack, OpenSource.

MashPack Является ли формат сериализации JSON-объекта, который является «диалектом» популярного формата MessagePack. . Я читаю Спецификация MessagePacks И заметил несколько подробностей, которые я думал, что я мог бы улучшить, поэтому я бросил вызов «победить» сообщение GostPack. Вот мои результаты:

  • Однобайтовый префикс переупорядочить
  • Напечатанные массивы
  • 8-битный тип массива
  • Расширения

Однобайтовые типы данных заголовка

Как MashPack, так и MessagePack используют приемы Bit-Prefix, чтобы упаковать определенные маленькие типы данных в один байт, пока до сих пор позволяет достаточно префиксировать пространство для поддержки всех других типов данных, которые нам нужно обеспечить эффективное использование пространства.

Обе спецификации, использующие однобайтовые типы данных. бесценно.

Mashpack. Mapp, strp, mararayp, intp, nintp
MessagePack. Положительный фиксатор, Fixstr, отрицательный Fixint, Fixmap, Fixarray

В MashPack типы данных и карты отображаются приоритеты с наибольшим количеством пространства. Сравните это с MessagePack, который приоритет приоритеты положительных целых чисел довольно сильно, и все другие типы данных имеют меньшие диапазоны в результате.

Смотрите таблицы ниже, сравнивая два спецификации:

MAPP / FIXMAP От 0 до 63 пар ключей От 0 до 15 пар ключей
Strp / fixstr. От 0 до 63 закодированных байтов От 0 до 31 закодированных байтов
Marraep / fixarray От 0 до 31 элемента От 0 до 15 элементов
Nintp / негативный фиксин -1 до -32. -1 до -32.
INTP / положительный фиксин От 0 до 31. 0 до 127.

Посмотреть Все типы данных MashPack в одной таблице Чтобы получить больше информации.

Напечатанные и смешанные массивы

MashPack добавляет новый тип данных, который не присутствует в MessagePack, называемом «напечатанным массивом» или просто Массив * Отказ Это в отличие от «смешанного массива» ( Marray * ) требует, чтобы все объекты в массиве были одинаковыми типами данных. Объекты, которые имеют разные заголовки, но в одной и той же семье могут быть «модернизированы» на более крупный тип данных, пока полученный напечатанный массив меньше, чем иметь смешанный массив.

Пример представляет собой список целых чисел, один из которых будет закодирован в Intp Тип, и все остальные преобразуются в Int8 будет преобразован в Array8 [int8] Отказ Смотри ниже:

object = [1, 255, 255]
could be naively encoded into:
MARRAYP([INTP(1), INT8(255), INT8(255)]) = 7 bytes

but converting the INTP(1) into INT8(1) we can take
advantage of typed arrays to end up with this:

ARRAY8[INT8]([1, 255, 255]) = 6 bytes

Добавление 8-битного типа массива

Несмотря на неиспользуемый идентификатор типа данных ( 0xc1 ) MessagePack не определяет 8-битный тип массива. Это в дополнение к меньшим диапазону фиксатрай Быть только 15 элементами означает, что массивы с 16 элементами в MessagePack Используйте 3 байта заголовка, а не 1 в MashPack, используя Маррайп Отказ

Большие строки означает дружелюбный Unicode

Unicode принесла много гармонии к тому, что раньше было действительно сложной проблемой с повсеместным рендерингом байта на строки. Одно из необходимых злых Unicode заключается в том, что не все персонажи – это 8 битов, что означает, что каждая строка, которая не является ASCII, требует только дополнительного пространства для хранения. MashPack может хранить вдвое больше, количество кодированных байтов в однобайтовой строке помогает с этой проблемой.

Реализация Python MessagePack также имела странные отношения со своими строковыми типами данных из-за Python 2. Текущий реализация MashPack Python поддерживает только Python 3+ и только позволяет кодировать UTF-8 для его строкового типа.

Большие строки означает URL-адреса в основном короткими!

Многие apis stadays имеют полезные «исследовательские» URL-адреса для подсказки пользователей API о дополнительном содержании. Это почти всегда будет принимать форму полного URL, которые, как правило, довольно долго! Почти всегда длиннее 31 байта. Наличие большей однобайтовой строки помогает решить эту проблему. См. Раздел сравнения производительности сжатия.

Расширения

MashPack определяет три размера типа расширения ( Ext8 , ext16 и ext32 ), а messagepack определяет 8 ( fixint 1 , fixint 2 , fixint 4 , Fixint 8 , Fixint 16 , Ext8 , Ext16 и Ext32 Несомненно

Расширения работают очень аналогично в MessagePack и MashPack в том, что у них есть код расширения и раздел данных. Код расширения представляет собой unsigned integer от 0 до 255, что обозначает то, что используется расширение. Разница между расширениями MessagePack и MashPack заключается в том, что фиксированный тип расширения для GessPack определяет «фиксированные» расширения, которые имеют ровно 1, 2, 4, 8 или 16 байтов. Это позволяет 2-байты заголовка для расширений с меньшими разделами данных.

Mashpack позволяет использовать только 3-байтовый заголовок, поэтому небольшие расширения данных страдают от слегка хранения под MashPack. При использовании раздела данных 17 байтов или более длинные расширения упаковывают одинаково под MashPack и MessagePack.

Меньше префиксных ярусов

Префикс MashPack (2×2-> 3×3-> 31×8), имеющих только три слоя по сравнению с префиксом Prefix MessageSpack (1×1-> 2×3-> 2×4-> 31×8) означает, что MashPack будет использовать максимум 3 сравнения только для определения типа упакованных объектов. до 4 для GessPack.

Быстрый распаковщик положительного фиксима

Положительный тип FIXINTINT ISSPACKS PREFIXED как префикс 0xxxxxxx позволяет читать целое число непосредственно от байта, оно находится без маскировки.

MashPack не имеет этого свойства, но требует только одной операции битовой маски для компенсации для него. Эта разница была необходимой пострадавшей, обеспечивающей лучшие битовые префиксы и диапазоны для других объектов.

Как mashpack, так и messagepack’s Nintp И негативные фиксима имеют это свойство для отрицательных чисел с префиксом 111xxxxx Отказ

Различия сжатия

Вот несколько маленьких, средних и больших объектов для сравнения сжатия между MashPack и MessagePack. Ниже – лучше.

127 +1 (+50%) 2 1
[1] * 16 -2 (-10.5%) 17 19
Урл -2 (-4.1%) 46 48
[127] * 100 +2 (+1.9%) 103 101
[255] * 100 -100 (-49.2%) 103 203
Github push-мероприятия -101 (-1.6%) 6091 6192

Различия в скорости

Вот несколько небольших и больших объектов, которые были обработаны в 10 000 раз, чтобы проверить различия в упаковке и распаковке скорости между MashPack и MessagePack. Ниже – лучше.

ПРИМЕЧАНИЕ: Эти сравнения скорости были выполнены на Intel I5-6400 4×2.7ghz с 16 ГБ ОЗУ и используя версию Gobeback «Python», поскольку еще нет реализации Cython MashPack. Больше ориентиров будут приходить к сравнению реализации Cython позже.

Упаковка объектов

[1, 1, 1, 1, 1] -0,09 секунд 0,22 секунды 0,31 секунды
Github push-мероприятия -16.5 секунды 42,9 секунды 59,4 секунды

Распаковки объектов

[1, 1, 1, 1, 1] 0 секунд 0,15 секунды 0,15 секунды
Github push-мероприятия -1,33 секунды 8,39 секунды 9,72 секунды

Mashpack – совершенно новая спецификация! Это было много осталось сделать, прежде чем он закреплен в стандарте. Это всегда самая забавная часть проектов, поэтому я хочу поделиться этим со всем, кто заинтересован.:)

Каждый, который способствует репозитории MashPack, получит сотрудничестве для хранилища, как я бы хотел, чтобы это было проектом для сообщества. Все изменения требуют обзора кода одним другим сотрудником и любыми владельцами кода.

Новый для открытого источника или Python?

Есть некоторые проблемы, которые я пометил Хороший первый вопрос Что я готов поставить дополнительное время, усилия и ресурсы, чтобы помочь вам. Если вы хотите решить одну из этих вопросов, но почувствуйте необходимость дополнительной поддержки, которую вы можете Сообщите мне в Twitter задавать вопросы.:-)

Готов к решению более жестких проблем?

Есть много вопросов для участия в этой категории все помечены Помогите хотеть этикетка . Я соберусь к этим в конце концов Но если вы хотите внести свой вклад и получить ваше имя, это отличное место для начала.

Вы знакомы или заинтересованы в обучении Cython?

Как указано выше, нет реализации CITHON PAKER MASHPACK или USCACKER объектов. Наличие реализации Cython увеличит скорость операций в десять раз и необходима, чтобы быть хорошим конкурентом для GessPack. Я пометил все Вопросы, связанные с Cython с этикеткой.

Оригинал: “https://dev.to/sethmlarson/mashpack—beating-messagepack-at-its-own-game-3p18”