Действительно хорошая тема и после прочтения нескольких ответов, я хочу поделиться своими экспериментами на эту тему.
У меня есть сценарий использования, когда к какой-то «огромной» таблице нужно обращаться почти каждый раз, когда я общаюсь с базой данных (не спрашиваю почему, просто факт). Система кэширования базы данных не подходит, так как она не будет кэшировать различные запросы, поэтому я думаю о системах кэширования php.
Я пытался, apcu
но это не соответствовало потребностям, в этом случае память недостаточно надежна. Следующим шагом было кеширование в файл с сериализацией.
В таблице 14355 записей с 18 столбцами, это мои тесты и статистика чтения сериализованного кэша:
JSON:
Как вы все сказали, основное неудобство с json_encode
/ json_decode
заключается в том, что он преобразует все в StdClass
экземпляр (или объект). Если вам нужно зациклить его, вы, вероятно, будете преобразовывать его в массив, и да, это увеличивает время преобразования
среднее время: 780,2 мс; использование памяти: 41,5 МБ; размер файла кэша: 3.8MB
Msgpack
@hutch упоминает msgpack . Симпатичный сайт. Давайте попробуем?
среднее время: 497 мс; использование памяти: 32 МБ; Размер файла кэша: 2,8 МБ
Это лучше, но требует нового расширения; компиляция иногда боится людей ...
IgBinary
@GingerDog упоминает igbinary . Обратите внимание, что я установил, igbinary.compact_strings=Off
потому что меня больше интересует производительность чтения, чем размер файла.
среднее время: 411,4 мс; использование памяти: 36,75 МБ; Размер файла кэша: 3,3 МБ
Лучше, чем MSG Pack. Тем не менее, этот тоже требует компиляции.
serialize
/unserialize
среднее время: 477,2 мс; использование памяти: 36,25 МБ; размер файла кэша: 5,9 МБ
Чем лучше производительность, чем JSON, тем больше массив, тем медленнее json_decode
, но вы уже новичок в этом.
Эти внешние расширения сужают размер файла и кажутся великолепными на бумаге. Числа не лгут *. Какой смысл компилировать расширение, если вы получаете почти те же результаты, что и при использовании стандартной функции PHP?
Мы также можем сделать вывод, что в зависимости от ваших потребностей вы выберете что-то другое, чем кто-либо другой:
- IgBinary действительно хорош и работает лучше, чем MsgPack
- Msgpack лучше сжимает ваши данные (обратите внимание, что я не пробовал опцию igbinary compact.string).
- Не хотите компилировать? Используйте стандарты.
Вот и все, еще одно сравнение методов сериализации, чтобы помочь вам выбрать один!
* Протестировано с PHPUnit 3.7.31, php 5.5.10 - только декодирование со стандартным жестким диском и старым двухъядерным процессором - средние числа в 10 тестах с одинаковыми вариантами использования, ваша статистика может отличаться
JSON_UNESCAPED_UNICODE
.