воскресенье, 12 сентября 2010 г.

php unserialize

Обнаружил, что в PHP функция unserialize может серьёзно задуматься, если целевой объект - большой массив. В причинах пока не разобрался.

ini_set('memory_limit', '512M');
$file = '/tmp/1';
$data = range(1,2000000);

echo "Test serialize\n";
$time0 = microtime(1);
file_put_contents($file, serialize($data));
$time1 = microtime(1);
unserialize(file_get_contents($file));
$time2 = microtime(1);

$timeset = $time1-$time0;
$timeget = $time2-$time1;

echo "Serialize set time $timeset get time $timeget\n";


echo "Test JSON\n";
$time0 = microtime(1);
file_put_contents($file, json_encode($data));
$time1 = microtime(1);
json_decode(file_get_contents($file), true);
$time2 = microtime(1);

$timeset = $time1-$time0;
$timeget = $time2-$time1;

echo "JSON set time $timeset get time $timeget\n";

Результат работы

Test serialize
Serialize set time 1.39576292038 get time 31.2712199688
Test JSON
JSON set time 0.270380973816 get time 1.33044695854

1 комментарий:

Анонимный комментирует...

unserialize вообще очень медленная операция. Я сейчас не помню порядок, но когда-то сравнивал с конвертацией в json -- json много шустрее.

Кроме того, сериализация по serialize/unserialize менее гибкая. Сериализованные данные хранят информацию о днине строки, индексах в обычных массивах и пр. Руками (ака скриптами без unserialize) сериализованные данные править тяжело. Плюс был замечен баг: если некорректно настроен mb_string, сами строки сохраняются правильно, а длина их считается некорректно. Как следствие, unserialize валится.

json в этом смысле и удобней и надёжней.

Потестируй простеньким бенчмарком, сравни с json.