Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Igbinary и PHP serialize

Если вкратце, модуль igbinary в ПХП — замена встроенным функциям сериализации. Встроеные функции хороши только в одном — сериализованное значение получается читаемым (хотя, на мой взгляд, JSON всё же получше будет).

Igbinary пренебрегает читаемостью (это вообще бинарный формат) в пользу скорости и компактности. Вчера ночью я перевёл пару мест в одном из проектов нашей компании, а утром мой друг, И. Б., кинул мне ссылку на статью, где сравнивается скорость работы встроенных функций и igbinary, причём в тестах на сохранение строк последний сливает первому.

Удивительный результат, так как, например, с числами всё иначе — там разница в несколько раз в пользу igbinary (в случае типа с плавающей запятой — более почти в 20), что же за проблема со строками?

У меня возникло подозрение, что я знаю в чём дело. Обычно, когда я изучаю новый модуль, я смотрю так же и на его настройки. Вчера я тоже их просматривал (в этом модуле их всего-то три) и хорошо запомнил одну из них — «igbinary.compact_strings».

Опция хорошая — помогает экономить память (например, при сериализации в memcached), работает она очень просто — при сериализации, если в данных попадается строка, проверяем не встречалась ли такая же строка ранее, если встречалась, повторно строку не сохраняем, сохраняем лишь ссылку на предыдущее вхождение.

По-умолчанию она включена и очевидным образом должна замедлять сериализацию строк. Я решил её выключить и посмотреть насколько быстрее станет. Результаты на скриншоте — слева опция выключена, справа — включена.

Результаты тестов (19.54КиБ)

Как видите, разница разительная. Так что если вы ставите igbinary для скорости, то эту опцию лучше бы выключить.

Ctrl →RU
4 комментария
Kildor (kildor.ya.ru) 2013

Два вопроса:

  1. Почему в String-keys различается количество байтов, это же размер итоговой строки?
  2. Данные содержат дубликаты?
Kildor (kildor.ya.ru) 2013

PS: по поводу первого вопроса — имеется в виду столбец Serialize.

Евгений Степанищев (bolknote.ru) 2013

Комментарий для kildor.ya.ru:

  1. Почему в String-keys различается количество байтов, это же размер итоговой строки?
  2. Данные содержат дубликаты?

Там случайные строки (тест я из статьи брал, можно посмотреть исходный код), так что я не знаю содержали ли они в тот момент дубликаты.

gogis 2013

Я менял у нас memcache на memcached, там igbinary идет как бонус. Что интересно, я сразу вычитал, что compact strings лучше не включать, если вам нужна скорость. И еще более удивительно — у меня эта опция была по дефолту выключена. Я уже не помню, как все ставил и настраивал, но точно не тюнил это значение.

А так, расширение отличное, конечно же.