Производительность gzipped json против эффективной двоичной сериализации
JSON и Gzip - это простой способ сериализации данных. Они широко применяются в разных языках программирования. Также это представление переносимо между системами (не так ли?).
Мой вопрос заключается в том, достаточно ли json+gzip (менее чем в 2 раза дороже) по сравнению с очень эффективными методами двоичной сериализации? Я ищу затраты времени и места при сериализации различных видов данных.
1 ответ
Сериализация с помощью json+gzip занимает на 25% больше места, чем rawbytes+gzip для чисел и объектов. Для чисел с ограниченной точностью (4 значащих цифры) размер сериализации одинаков.
Источник: https://github.com/csiz/gzip-json-performance
чисел
Я выбрал 1e6 (64-битные) числа с плавающей запятой. Я предполагаю, что эти числа взяты из некоторого естественного источника, поэтому я использую экспоненциальное распределение и округляем их до 4 значащих цифр. Поскольку JSON записывает все представление, я думал, что хранение больших чисел может повлечь за собой большие затраты (123456,000000, вместо 0,123456), поэтому я проверяю оба случая. Есть также набор чисел, которые не были округлены.
Сжатый JSON против двоичного для небольших чисел (около 1,0):
json 3.29mb json/raw 43%
binary 3.03mb binary/raw 40%
json/binary 1.09
Сжатый JSON против двоичного для больших чисел (около 1000000):
json 2.58mb json/raw 34%
binary 3.10mb binary/raw 41%
json/binary 0.83
Сжатый JSON против двоичного для полной точности удваивается:
json 8.90mb json/raw 117%
binary 7.27mb binary/raw 95%
json/binary 1.22
Объекты
Для объектов я сериализую их обычным ленивым способом в JSON:
[
{
"small number": 0.1234,
"large number": 1234000,
"choice": "two"
},
...
]
В то время как для эффективного двоичного представления я векторизирую объекты:
n = 1e6
small number = binary([0.1234, ...])
large number = binary([1234000, ...])
choice = binary([2, ...]) # indexes to the enum ["zero", "one", ..., "four"]
Сжатый JSON против двоичного для объектов:
json 8.36mb json/raw 44%
binary 6.59mb binary/raw 35%
json/binary 1.27