вторник, 22 ноября 2022 г.

PHP. Что быстрее: json_encode, serialize или foreach с implode?

Для хранения данных в БД MySQL (небольшие массивы со штрихкодами товаров) стало важно понять, как лучше преобразовывать массивы в строку. Чтобы потом конвертить обратно. И чтобы нагрузка была минимальной.

Провёл небольшой тест, делюсь результатами.

Сам скрипт теста прилагаю ниже. Кому захочется поковырять у себя )
А прежде - результаты.
И ещё, сделал проверки на разных версиях PHP.

PHP5.6


  PHP 5.6.40
В массиве 100000 элементов, по 2 числовые строки в каждом

json_encode = 0.0695810318 s
json_decode = 0.1320719719 s
json_encode + json_decode = 0.2016530037 s

serialize   = 0.267168045 s
unserialize = 0.1992721558 s
serialize + unserialize = 0.4664402008 s

foreach & implode = 0.1874601841 s
foreach & explode = 0.1081588268 s
foreach & implode & explode = 0.2956190109 s

291.75 MB

PHP7.2


  PHP 7.2.34
В массиве 100000 элементов, по 2 числовые строки в каждом

json_encode = 0.0359508991 s
json_decode = 0.0598630905 s
json_encode + json_decode = 0.0958139896 s

serialize   = 0.0265569687 s
unserialize = 0.072510004 s
serialize + unserialize = 0.0990669727 s

foreach & implode = 0.0372829437 s
foreach & explode = 0.0356550217 s
foreach & implode & explode = 0.0729379654 s

222.1 MB

ВЫВОДЫ

1. Serialize/unserialize проигрывает на обеих версиях PHP.

2. На PHP5.6 json_encode/json_decode работает быстрее, чем переборы с implode/explode.

3. На PHP7.2 переборы с implode/explode работают быстрее, чем json_encode/json_decode.

4. В целом PHP7.2 ещё раз подтверждает своё быстродействие.


Скрипт, кому интересно:


<?php
ini_set('error_reporting', E_ALL); ini_set('display_errors', 1); ini_set('display_startup_errors', 1); ini_set("memory_limit", "512M"); function irprint($something, $text = '') {     $sapi = php_sapi_name();     if (!empty($text)) echo $text.':'.PHP_EOL;     if ($sapi != 'cli') echo '<pre>';     $print = $something;     if (empty($something)) $print = 'empty';     if ($something === 0 || $something === (float) 0 || $something === '0') $print = 0;     print_r($print);     if ($sapi != 'cli') echo '</pre>';     echo PHP_EOL; } $arr = []; for ($i = 1; $i <= 100000; $i++) {     $arr[] = ['АБВ12345678'.$i, 'ГДЕ23456789'.$i]; } irprint('PHP '.phpversion()); irprint('В массиве '.count($arr).' элементов, по 2 числовые строки в каждом'.PHP_EOL); $time = microtime(true); $json = json_encode($arr, JSON_UNESCAPED_UNICODE); $delta = microtime(true) - $time; $delta_je = round($delta, 10); irprint('json_encode = '.$delta_je.' s'); $time = microtime(true); $arr1 = json_decode($json); $delta = microtime(true) - $time; $delta_jd = round($delta, 10); irprint('json_decode = '.$delta_jd.' s'); irprint('json_encode + json_decode = '.($delta_je + $delta_jd).' s'.PHP_EOL); $time = microtime(true); $ser = serialize($arr); $delta = microtime(true) - $time; $delta_s = round($delta, 10); irprint('serialize   = '.$delta_s.' s'); $time = microtime(true); $arr2 = unserialize($ser); $delta = microtime(true) - $time; $delta_us = round($delta, 10); irprint('unserialize = '.$delta_us.' s'); irprint('serialize + unserialize = '.($delta_s + $delta_us).' s'.PHP_EOL); $time = microtime(true); $arr3 = []; foreach ($arr as $item) {     $arr3[] = implode(' ', $item); } $delta = microtime(true) - $time; $delta_im = round($delta, 10); irprint('foreach & implode = '.$delta_im.' s'); $time = microtime(true); $arr4 = []; foreach ($arr3 as $item) {     $arr4[] = explode(' ', $item); } $delta = microtime(true) - $time; $delta_ex = round($delta, 10); irprint('foreach & explode = '.$delta_ex.' s'); irprint('foreach & implode & explode = '.($delta_im + $delta_ex).' s'.PHP_EOL); $mem_peak = round((memory_get_peak_usage(true) / (1024 * 1024)), 2); irprint($mem_peak.' MB');

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

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