Я заменил JSON на собственный бинарный формат в PHP
Нам требовался более эффективный способ хранения форматированного текста для наших приложений и веб-сайтов.
Сначала мы хранили «сырой» HTML в нашей базе данных. Позже мы перешли на JSON, чтобы отделить процесс редактирования от вывода. JSON работал какое-то время, но по мере роста проекта возникли новые проблемы.
JSON стал слишком медленным для наших задач.
Когда нам нужно было искать и обновлять старые ссылки, приходилось парсить и пересобирать целые массивы. Этот процесс был медленным и неэффективным. Нам требовался формат, позволяющий быстрее манипулировать данными и использовать потоковую передачу.
Я решил создать собственный бинарный формат, используя PHP.
Многие разработчики считают, что PHP не предназначен для низкоуровневого управления байтами. Однако в PHP есть встроенные функции для этого:
pack(): преобразует числа или строки в «сырые» байты.unpack(): преобразует эти байты обратно в числа или строки.
Я перестал использовать операции с многобайтовыми строками. Вместо этого я сосредоточился на чтении конкретных блоков байтов. Например, для беззнакового 64-битного целого числа требуется ровно 8 байт. При работе с бинарными данными точность имеет решающее значение.
Я также изменил структуру данных.
Большинство людей пытаются хранить документы в виде глубокой вложенной древовидной структуры. Часто это ошибка. Я перешел к плоскому списку элементов, таких как текст, теги и списки. Для восстановления HTML я использую простое дерево смещений (offsets). Это делает такие задачи, как поиск всех ссылок или очистка HTML, очень быстрыми.
Результаты 10 000 итераций показывают явного победителя:
Старое кодирование JSON: 2,18 с Старое декодирование JSON: 0,86 с
Новое бинарное кодирование: 1,19 с Новое бинарное декодирование: 0,67 с
Новый формат быстрее как при кодировании, так и при декодировании.
Бинарный формат занимает больше места, чем JSON или HTML. Он требует примерно в два раза больше пространства, чем JSON. Поскольку мы используем рендеринг на стороне сервера, это увеличение объема хранилища не влияет на производительность.
Этот компромисс того стоит. Теперь мы можем изменять ссылки и очищать HTML с помощью простых и быстрых функций.
Если вы создаете собственный формат, напишите четкую спецификацию. Она обязательно понадобится вам, когда вы вернетесь к этому коду позже.
Источник: https://dev.to/tomj/i-replaced-json-with-a-custom-binary-format-in-php-mok