Pull to refresh

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

Reading time2 min
Views7.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
Tags:
Hubs:
+42
Comments74

Articles