Pull to refresh

Производительность кодирования и декодирования serialize и json

Reading time3 min
Views12K
Возникла мысль сравнить два способа хранения абстрактных данных в виде строк, реализованных в PHP: старая добрая сериализация и относительно недавно поддерживающий в языке формат json.

Для сравнения небольшой скрипт генерирует массив из 1000 элементов, две трети элементов которого — строки, длинной 15 символов (напополам — только буквы и только цифры), а оставшаяся треть — массивы по 50 элементов (также — буквенные и цифровые элементы пополам).

Итог весьма неоднозначен, подробности во второй части.



Заодно я убедился, что serialize/unserialize и json_encode/json_decode — очень быстрые функции и вряд-ли при разумных объемах данных способны стать «бутылочным горлышком».

Кодирование и декодирование выполнялось по 10 раз для каждого метода, в качестве результата работы скрипт выдает суммарное время всех 10 операций.

Наглядный график (заодно освоил азы Google Chart API):

serialize vs json

Результат работы скрипта:

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 Мой первый пост на Хабре :-)

Обновление: спасибо за конструктивные комментарии, они послужили толчком для второй части материала.
Tags:
Hubs:
+1
Comments39

Articles

Change theme settings