воскресенье, 15 декабря 2013 г.

Сериализация в PHP

Будут сравниваться 4-е способа сериализации:
1) Стандартная сериализация serialize
2) JSON
3) msgpack
4) igbinary

Кратко об установке.
JSON раньше шел в стандартной поставке php. Сейчас нужно поставить дополнительное расширение php5-json.
msgpack
Сайт: http://msgpack.org/
Исходники: https://github.com/msgpack/msgpack-php и http://pecl.php.net/package/msgpack
Ставим:

cd /tmp
wget http://pecl.php.net/get/msgpack-0.5.5.tgz
tar xzf msgpack-0.5.5.tgz
cd msgpack-0.5.5
phpize
./configure
make
make test

Если тесты прошли нормально, то создаем пакет и ставим:
sudo checkinstall -D --install=no
sudo dpkg -i msgpack_0.5.5-1_amd64.deb

igbinary
Исходники: https://github.com/phadej/igbinary/tree/master и http://pecl.php.net/package/igbinary
Далее опять
cd /tmp
wget http://pecl.php.net/get/igbinary-1.1.1.tgz
tar xzf igbinary-1.1.1.tgz
cd igbinary-1.1.1
phpize
./configure
make
make test
sudo checkinstall -D --install=no
sudo dpkg -i igbinary_1.1.1-1_amd64.deb


msgpack добавляет функции
BinData msgpack_pack(phpValue);
phpValue msgpack_unpack(BinData);


igbinary добавляет функции
BinData igbinary_serialize(phpValue);
phpValue igbinary_unserialize($BinData);


Что бы они заработали, нужно незабыть включить их в php.ini:
[igbinary]
extension=igbinary.so

; Enable or disable compacting of duplicate strings
; The default is On.
;igbinary.compact_strings=On

[msgpack]
extension=msgpack.so


Что еще важно отметить.
serialize - стандартная функция php. JSON - старое и стабильное расширение. igbinary - тоже достаточно старая библиотека, давно вышедшая в стабильную ветку. msgpack - на данный момент все еще находится в стадии beta. С msgpack мне реально доводилось ловить глюки в ее предыдущих релизах. И если я решусь внедрять ее в продакшен, то там где, ее ошибки не принисут фатального ущерба.

Собственно тесты:


1. Массив вида
array (
  'v0' =>
  array (
    0 => 0,
    1 => 1,
    2 => 2,
    ...
    3 => 3,
    23 => 23,
    24 => 24,
  ),
  'rnd0' => '2e0c883df6e2cb771103f4409f053549094d6787',
    ..........
)

c 16384 элементами

Время
сериализации (msec)
Время
десериализации (msec)
размер упакованных данных (Kb)
MessagePack925678
igbinary
compact_strings=Off
9321278
igbinary
compact_strings=On
16321120
JSON143181022
SERIALIZE62392486

2.Массив вида
array (
  0 => 3183,
  1 => 4527,
  2 => 4084,
  3 => 4032,
  4 => 3920,
...
  262144 => 4455,
)



Время
сериализации (msec)
Время
десериализации (msec)
размер упакованных данных (Kb)
MessagePack830769
igbinary
compact_strings=Off
9331920
igbinary
compact_strings=On
9331920
JSON151071281
SERIALIZE86443988

3.Массив вида
array (
  0 => 7679461759223599104,
  1 => 4898705982311625344,
  2 => 5880628818820227328,
  ...
  262144 => 6940876209816891904,
)

Время
сериализации (msec)
Время
десериализации (msec)
размер упакованных данных (Kb)
MessagePack10292305
igbinary
compact_strings=Off
11333456
igbinary
compact_strings=On
11333456
JSON201725121
SERIALIZE92497828

4.Массив видаarray (
  0 => 0.00038631346578366,
  1 => 0.00016131634134538,
  2 => 0.00043595779928503,
  3 => 0.00011754334410814,
  4 => 0.00049353469548909,
  5 => 5.2391680201184E-5,
  .....
  262144 => 0.00041876046901173,
)


Время
сериализации (msec)
Время
десериализации (msec)
размер упакованных данных (Kb)
MessagePack9282305
igbinary
compact_strings=Off
11333456
igbinary
compact_strings=On
11333456
JSON751975061
SERIALIZE2641768538

5.Массив вида
array (
  0 => 'f7df8cb47630b8cd7eb73d0da7a23b9c01aaaa84f718499c1c8cef6730f9fd03c8125cab',
  1 => 'd30f79cf7fef47bd7a5611719f936539bec0d2e93bcf6eecb2611212e088d0d91f2ade9c',
  2 => '86bce22a4d2805649853ac7909c4efb4dd18f255086af6e4641abb18caafc151b9aa95c8',
  3 => '63afd0edc0371ad842d7a7ecc76260be4bc3e8c0da6cb383f8f9e58f2c8af88a8c0eb65e',
  4 => '13c80015875a668e8fc059517ffd124abbda63c12d95666e2649fcfc6e3af75e09f5adb9',
  ...
  32768 => '0e3808238b738aafc13a2a62f36d2a49dec4e191c22abfa379f38b5b0411bc11fa9bf92f',
)

Время
сериализации (msec)
Время
десериализации (msec)
размер упакованных данных (Kb)
MessagePack452401
igbinary
compact_strings=Off
462464
igbinary
compact_strings=On
2162463
JSON28162401
SERIALIZE1072806


Замечу что приведенные в таблицах данные являются примерными и зависят от данных. Т.к. данные у меня заполнялись случайным образом, то цифры получались разные, но разница не существенна и в целом эти цифры отражают реальную картину.

Комментариев нет:

Отправить комментарий