Действительно хорошая тема, и после прочтения нескольких ответов я хочу поделиться своими экспериментами по этому вопросу.
У меня есть сценарий использования, когда какую-то "огромную" таблицу нужно запрашивать почти каждый раз, когда я общаюсь с базой данных (не спрашивайте почему, просто факт). Система кэширования базы данных не подходит, поскольку она не будет кэшировать различные запросы, поэтому я думаю о системах кэширования php.
Я пытался apcu
, но это не соответствовало потребностям, память в этом случае недостаточно надежна. Следующим шагом было кеширование в файл с сериализацией.
Таблица содержит 14355 записей с 18 столбцами, это мои тесты и статистика по чтению сериализованного кэша:
JSON:
Как вы все сказали, главное неудобство с json_encode
/ json_decode
заключается в том, что он преобразует все в экземпляр StdClass
(или Объект). Если вам нужно его зациклить, вы, вероятно, будете преобразовывать его в массив, и да, это увеличивает время преобразования
среднее время: 780,2 мс; использование памяти: 41,5 МБ; размер файла кэша: 3,8 МБ
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 тестах с одинаковыми вариантами использования, ваша статистика может отличаться