Знакомство с новым решением MessagePack.
Контур:
- Что такое JSON
- Что такое MessagePack
- Заключение
Что такое JSON?
JSON (объектная нотация JavaScript) - один из наиболее распространенных форматов данных, которые мы используем для хранения и передачи данных. Две особенности JSON:
- человек читаемый
- машиночитаемый
Допустим, я хочу сохранить следующие слова в JSON.
Привет, меня зовут Крис. Мне 26 лет. Я люблю читать.
{ "name": "Chris", "age": 26, "hobby": "read" }
Как видите, мы помещаем данные в пары ключ-значение. Ключи здесь - имя, возраст, хобби, каждому ключу соответствует значение. И мы используем {}
, чтобы обернуть их, и ,
, чтобы разделить каждую пару "ключ-значение".
Привет, меня зовут Крис. Мне 26 лет. Я люблю читать и писать.
{ "name": "Chris", "age": 26, "hobby": ["read", "write"] }
Если ключ соответствует нескольким значениям, мы используем []
, чтобы обернуть их.
[ { "name": "Chris", "age": 26, "height": 183, "weight": 80, "hobby": ["read", "write"] }, { "name": "Glenn", "age": 21, "height": 169, "weight": 87, "hobby": ["eat", "sleep"] }, ... ]
Мы все еще сможем четко понять эти данные, если информация станет больше и сложнее. Гленн такой ленивый, правда?
JSON также машиночитаем. Мы можем использовать любой язык программирования, чтобы преобразовать его в Словарь. Как только мы превратим JSON в словарь, мы сможем выполнять с ним всевозможные манипуляции.
JSON ↔ Словарь
(Используйте JSON для хранения или передачи) JSON ↔ Словарь (Язык программирования может выполнять с ним все виды манипуляций. Чтение, вставка, редактирование, удаление…)
В качестве примера воспользуемся приведенным выше JSON:
<?php $content = file_get_contents('simple.json'); //turn json into dictionary $content_decode = json_decode($content); //do all kinds of manipulation foreach ($content_decode as $person) { print_r($person->name."\n"); } // Chris // Glenn //turn dictionary back into json $content = json_encode($content_decode); file_put_contents('simple.json', $content); ?>
Что такое MessagePack
Это как JSON. Но быстро и мало.
Это цитата с сайта MessagePack. MessagePack похож на JSON, мы можем превратить MessagePack в словарь и наоборот.
MessagePack ↔ СЛОВАРЬ
(Используйте MessagePack для хранения или передачи) MessagePack ↔ Словарь
По сравнению с JSON. MessagePack меньше, когда мы конвертируем тот же словарь в MessagePack. MessagePack работает быстрее, когда мы конвертируем его в словарь или конвертируем обратно.
Почему MessagePack меньше? В JSON слишком много {}
, :
, пробелов или повторяющихся строк, которые не нужны машине. MessagePack убрал их и использовал свой уникальный способ упаковки этих данных в меньший размер.
MessagePack, как и JSON, поддерживается и может быть установлен на многих языках, php, python, javascript, swift… список можно продолжить. Позвольте мне показать вам, как это делается в php.
<?php //dictionary $data = array( 'name'=>'chris', 'age'=>26, 'hobby'=>['read', 'write'] ); //dictionary to MessagePack $msg = msgpack_pack($data); file_put_contents('msgpack.txt', $msg); //output: //ƒ¤name¥chris£age¥hobby’¤read¥write //MessagePack back to dictionary $data = msgpack_unpack($msg); ?>
Как видите, вывод не читается (даже не печатается), и это главный компромисс между объемом и скоростью. Особенности MessagePack:
- h̶u̶m̶a̶n̶-̶r̶e̶a̶d̶a̶b̶l̶e̶
- машиночитаемый
- Быстрее
- меньше
После нескольких тестов я обнаружил, что MessagePack примерно на 10% меньше, чем JSON. В 4 раза быстрее, чем JSON при преобразовании в словарь, в 6 раз быстрее при преобразовании из словаря (Если вам интересно, вы можете проверить мой Github, я использую php).
Заключение
Что мне использовать?
Чтобы ответить на этот вопрос, мы должны подумать с другой стороны:
- Читаемость
Действительно ли источник данных вашего проекта должен быть удобочитаемым? Я знаю, что удобочитаемость действительно важна при разработке или отладке. Но большая часть вашего кода имеет дело со словарем, а это означает, что мы можем легко переключиться с использования JSON на MessagePack, когда мы перейдем к этапу производства. Короче говоря, зависит от того, сколько вам нужно прочитать напрямую из источника данных.
2. Скорость кодирования / декодирования
Если вашему приложению очень часто требуется чтение и запись из источника данных, скорость определенно то, что вам нужно. Например, мобильная игра должна сохранять данные каждые полсекунды и передавать данные обратно на сервер. В этом случае мы можем выбрать MessagePack.
3. Хранение
MessagePack на 10% меньше, чем JSON, и эти 10% могут сэкономить вам приличную сумму денег.
4. Передача HTTP / HTTPS.
Когда мы используем HTTP / HTTPS для передачи данных, нам сначала нужно URL-кодировать данные. Например, пробел необходимо закодировать в %20
. Хотя сам MessagePack меньше JSON, после кодирования URL он станет больше, чем JSON. Потому что в MessagePack нужно избегать большого количества символов. Некоторая плата за обслуживание зависит от того, сколько данных передается и отправляется, поэтому вам, возможно, придется подумать об использовании MessagePack.
В заключение MessagePack жертвует удобочитаемостью и дает мощное решение. Попробуйте!