Обнаружил, что в 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
Подписаться на:
Комментарии к сообщению (Atom)
1 комментарий:
unserialize вообще очень медленная операция. Я сейчас не помню порядок, но когда-то сравнивал с конвертацией в json -- json много шустрее.
Кроме того, сериализация по serialize/unserialize менее гибкая. Сериализованные данные хранят информацию о днине строки, индексах в обычных массивах и пр. Руками (ака скриптами без unserialize) сериализованные данные править тяжело. Плюс был замечен баг: если некорректно настроен mb_string, сами строки сохраняются правильно, а длина их считается некорректно. Как следствие, unserialize валится.
json в этом смысле и удобней и надёжней.
Потестируй простеньким бенчмарком, сравни с json.
Отправить комментарий