Русские документы
Ежедневные компьютерные новости RSS rusdoc.ru  Найти :
Новости
Последние поступления
Книжный магазин
  Hardware:
Видеоустройства
Системные платы
Процессоры
Мобильные устройства
Аудиосистема
Охлаждение системы
Накопители информации
КПК и ноутбуки
Телефоны и связь
Периферия
Система
Сети
Разные устройства
 
  Programming:
Web-разработка
Языки программирования
Технологии и теория
Разработка игр
Программная инженерия
 
  Software:
Операционные системы
Windows 7
Базы данных
Обзоры программ
Графика и дизайн
   
  Life:
Компьютерная жизнь
Разные материалы
   
Партнеры
Публикация
Правовая информация
Реклама на сайте
Обратная связь
Экспорт в RSS Экспорт в RSS2.0
    Читать в Яндекс.Ленте



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

Раздел: Programming / PHP @ 28.07.2008 | Ключевые слова: php serialize json производительность версия для печати

Автор: casey
Источник: habrahabr

Возникла мысль сравнить два способа хранения абстрактных данных в виде строк, реализованных в 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.




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

Это интересно:








версия для печатиРаспечатать статью


Вернуться в раздел: Programming / PHP


Реклама:
Читать наc на:

Add to Google
Читать в Яндекс.Ленте






Rambler's Top100
© Copyright 1998-2012 Александр Томов. All rights reserved.