Для хранения данных в БД 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');
Комментариев нет:
Отправить комментарий