2-байтовое увеличение в сериализованном размере сообщения PB в случае добавления одного логического поля? - PullRequest
1 голос
/ 23 апреля 2011

Я создаю PB-сообщения, содержащие 4 поля int32. Я хотел добавить еще два логических поля к этому сообщению. Я заметил, что размер увеличился на 4 байта для 2 логических полей. Должны ли логические значения занимать до 2 байтов на поле. Разве они не могут храниться в более компактной форме?

Ответы [ 3 ]

2 голосов
/ 23 апреля 2011

Каждый заголовок поля занимает 1 байт (для младших номеров полей; больше для больших номеров полей), а каждый bool занимает 1 байт. В protobuf нет суббайтной упаковки; все округляется до ближайшего байта.

1 вариант будет хранить целочисленную карту без знака - т.е. Относитесь к каждому булу как к степени двойки и складывайте их (поразрядно). Затем вам нужен один байтовый заголовок и один байтовый данные, так что 2 байта для обоих. Вы, однако, должны будете упаковать / распаковать целое число самостоятельно. Предполагая, что у вас низкий номер поля, до 7 булев - это 1 байтовые данные плюс 1 байтовый заголовок. Поскольку «varint» использует кодировку base-128 (msb является продолжением), восьмой тип bool (до 14 единиц bool) будет принимать 2-байтовые данные плюс 1-байтовый заголовок.

0 голосов
/ 23 апреля 2011

Всегда существует компромисс между пространством и временем доступа.

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

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

0 голосов
/ 23 апреля 2011

Это не так удивительно. Вероятно, он использует один байт в качестве флага типа для следующего значения, а затем сохраняет бит в байте. Вы можете упаковать много битов в целочисленный тип (8 в символе, 16 в коротком, 32 в целом) для более эффективной передачи. Стоит ли экономия полосы пропускания при написании и запуске кода упаковки, зависит от вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...