Как стать автором
Обновить

Производительность функции unserialize

Время на прочтение 2 мин
Количество просмотров 7.7K
В PHP есть две замечательные функции serialize и unserialize. Первая преобразует в строку практически любой набор данных, вторая производит обратное преобразование. Эти функции удобно использовать при организации кеширования или хранения сессий в базе данных. Я обнаружил, что время работы функции unserialize может оказаться неожиданно большим.

Не буду описывать как и почему мне потребовалось сериализовать и десериализовать большой массив данных, гораздо интереснее посмотреть на то, что я обнаружил.
  1. <?php
  2. ini_set('memory_limit', '512M');
  3. $file = '/tmp/1';
  4. $data = range(1,2000000);
  5.  
  6. echo "Test serialize\n";
  7. $time0 = microtime(1);
  8. file_put_contents($file, serialize($data));
  9. $time1 =  microtime(1);
  10. unserialize(file_get_contents($file));
  11. $time2 =  microtime(1);
  12.  
  13. $timeset = $time1-$time0;
  14. $timeget = $time2-$time1;
  15.  
  16. echo "Serialize set time $timeset get time $timeget\n";

Test serialize
Serialize set time 1.35619807243 get time 31.1126699448


30 секунд на десериализацию! Этот результат меня просто шокировал. Для начала я проверил, что file_get_contents не влияет на результат выполнения. Затем посмотрел на производительность json_encode и json_decode (JSON set time 0.270335912704 get time 1.30652809143). «Всё страньше и страньше», подумал я и решил построить график зависимости времени работы функции unserialize от длины десериализуемого массива.



На графике чётко видна квадратичная (!) зависимость времени выполнения функции от длины массива. Вот такая неожиданно медленная встроенная функция unserialize.

Ситуация, конечно, не критичная. Можно использовать другие способы сериализации и десериализации. Основная цель статьи — показать как зависит производительность функции unserialize от размера данных.

Исходные коды для проверки результатов можно взять по адресу http://alexxz.ru/habr/unserialize_benchmark.tar.gz

Используемый софт и железо PHP 5.3.2
Linux ubuntu 2.6.32–24-generic (10.4)
Intel® Core2 CPU 6600 @ 2.40GHz

______________________
Текст подготовлен в Редакторе Блогов от © SoftCoder.ru
Теги:
Хабы:
+42
Комментарии 74
Комментарии Комментарии 74

Публикации

Истории

Работа

PHP программист
149 вакансий

Ближайшие события

PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн
Weekend Offer в AliExpress
Дата 20 – 21 апреля
Время 10:00 – 20:00
Место
Онлайн