Производительность кодирования и декодирования 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):
Результат работы скрипта:
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://www.rusdoc.ru/go.php?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