Возникла мысль сравнить два способа хранения абстрактных данных в виде строк, реализованных в PHP: старая добрая сериализация и относительно недавно поддерживающий в языке формат json.
Для сравнения небольшой скрипт генерирует массив из 1000 элементов, две трети элементов которого — строки, длинной 15 символов (напополам — только буквы и только цифры), а оставшаяся треть — массивы по 50 элементов (также — буквенные и цифровые элементы пополам).
Итог весьма неоднозначен, подробности во второй части.
Заодно я убедился, что serialize/unserialize и json_encode/json_decode — очень быстрые функции и вряд-ли при разумных объемах данных способны стать «бутылочным горлышком».
Кодирование и декодирование выполнялось по 10 раз для каждого метода, в качестве результата работы скрипт выдает суммарное время всех 10 операций.
Наглядный график (заодно освоил азы Google Chart API):

Результат работы скрипта:
Код скрипта, используемого для тестирования:
PS Мой первый пост на Хабре :-)
Обновление: спасибо за конструктивные комментарии, они послужили толчком для второй части материала.
Для сравнения небольшой скрипт генерирует массив из 1000 элементов, две трети элементов которого — строки, длинной 15 символов (напополам — только буквы и только цифры), а оставшаяся треть — массивы по 50 элементов (также — буквенные и цифровые элементы пополам).
Итог весьма неоднозначен, подробности во второй части.
Заодно я убедился, что serialize/unserialize и json_encode/json_decode — очень быстрые функции и вряд-ли при разумных объемах данных способны стать «бутылочным горлышком».
Кодирование и декодирование выполнялось по 10 раз для каждого метода, в качестве результата работы скрипт выдает суммарное время всех 10 операций.
Наглядный график (заодно освоил азы Google Chart API):

Результат работы скрипта:
Data length (print_r): 610Kb
Serialize: 0.22sec. (472Kb)
Unserialize: 0.17sec.
JSON encode: 0.19sec. (303Kb)
JSON decode: 0.26sec.
Код скрипта, используемого для тестирования:
<?
$data = array ();
//циферки
for ($i = 0; $i < 500; $i ++)
{
$data[] = getRandomString (true, 15);
}
//буковки
for ($i = 0; $i < 500; $i ++)
{
$data[] = getRandomString (false, 15);
}
//вложенность треть элементов имеют вложенность
for ($i = 0; $i < 334; $i ++)
{
$index = intval(rand(0, 1000));
$data[$index] = array ();
//вложенность по 50 элементов
for ($j = 0; $j < 25; $j ++)
{
$data[$index][] = getRandomString (false, 15);
$data[$index][] = getRandomString (true, 15);
}
//перемешиваем
shuffle ($data[$index]);
}
//перемешиваем
shuffle ($data);
$rounds = 10;
//serialize
echo 'Data length (print_r): '. round (strlen (print_r($data, true)) / 1024). 'Kb<br/>';
//кодирование
$a = new pgt;
for ($i = 0; $i < $rounds; $i ++)
{
$serialize = serialize ($data);
}
$d[0] = round ($a->getValue (), 2);
echo 'Serialize: '. $d[0]. 'sec. ('. round (strlen ($serialize) / 1024). 'Kb)<br/>';
//декодирование
$a = new pgt;
for ($i = 0; $i < $rounds; $i ++)
{
$serialize1 = unserialize ($serialize);
}
$d[1] = round ($a->getValue (), 2);
echo 'Unserialize: '. $d[1]. 'sec.<br/>';
//json
//кодирование
$a = new pgt;
for ($i = 0; $i < $rounds; $i ++)
{
$json = json_encode ($data);
}
$d[2] = round ($a->getValue (), 2);
echo 'JSON encode: '. $d[2]. 'sec. ('. round (strlen ($json) / 1024). 'Kb)<br/>';
//декодирование
$a = new pgt;
for ($i = 0; $i < $rounds; $i ++)
{
$json1 = json_decode ($json);
}
$d[3] = round ($a->getValue (), 2);
echo 'JSON decode: '. $d[3]. 'sec.<br/>';
foreach ($d as $index => $value)
{
$d[$index] = $d[$index] * 100 * 3.7;
}
//$val = 'http://chart.apis.google.com/chart?cht=bvg&chd=t:'. $d[0]. ','. $d[2]. '|'. $d[1]. ','. $d[3]. '&chs=260x300&chl=serialize|json&chco=4d89f9,c6d9fd&chdl=encoding|decoding&chxt=y&chxl=0:|0 sec|0.027 sec';
//echo '<br/><img src="'. $val. '"/>';
class pgt {
function __construct () {
$this->time = $this->GetTime ();
}
public function getValue () {
$value = $this->GetTime() — $this->time;
return $value;
}
//служебная внутрення часть
private function getTime () {
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
}
function getRandomString ($letters, $length)
{
if ($letters === true)
{
$a = 'ABCDEFZHIJKLMKOPQRSTUVWXYZabcdefzhijklmkopqrstuvwxyz';
}
else
{
$a = '0123456789';
}
$result = '';
for ($i = 0; $i < $length; $i ++)
{
$result .= substr ($a, intval(rand(0, strlen ($a) — 1)), 1);
}
return $result;
}
?>* This source code was highlighted with Source Code Highlighter.
PS Мой первый пост на Хабре :-)
Обновление: спасибо за конструктивные комментарии, они послужили толчком для второй части материала.