Igbinary и PHP serialize

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

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

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

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

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

По-умолчанию она включена и очевидным образом должна замедлять сериализацию строк. Я решил её выключить и посмотреть насколько быстрее станет. Результаты на скриншоте — слева опция выключена, справа — включена. Результаты тестов (19.54КиБ) Как видите, разница разительная. Так что если вы ставите igbinary для скорости, то эту опцию лучше бы выключить.
19 октября 2013 13:44

Kildor (kildor.ya.ru)
21 октября 2013, 05:52

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

Kildor (kildor.ya.ru)
21 октября 2013, 05:53

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

Евгений Степанищев (bolknote.ru)
21 октября 2013, 06:14, ответ предназначен Kildor (kildor.ya.ru):

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

gogis (инкогнито)
1 ноября 2013, 21:57

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

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)