Архив рубрики: никчемное исследование

json_encode vs. serialize

Итак, продолжение серии бесполезных исследований. В этот раз мы сравниваем несколько разные по сути функции, которые, тем не менее, часто используются с одной целью. В этом исследовании мы хотим представить массив значений (не объектов PHP) в качестве строки. Это исследование инициировал на работе Фархад Вильданов. К сожалению, ему это не помогло, так как он имел дело как раз с массивом объектов PHP.

Что нам скажет serialize()?

<?php
ini_set('memory_limit', '4G');

$initialArray = array_fill(0, 1000000, ['test value']);
$start = microtime(true);
$serializedA = serialize($initialArray);
$end = microtime(true);

echo 'serialize() string length: ' . strlen($serializedA) . PHP_EOL;
echo 'serialize() time: ' . ($end - $start) . PHP_EOL;
echo 'serialize() memory: ' . memory_get_peak_usage(true) . PHP_EOL;

Вывод:

serialize() string length: 36888902
serialize() time: 0.43295097351074
serialize() memory: 327155712

Так выглядит тест для json_encode():

<?php
ini_set('memory_limit', '4G');

$initialArray = array_fill(0, 1000000, ['test value']);
$start = microtime(true);
$json = json_encode($initialArray);
$end = microtime(true);

echo 'json_encode() string length: ' . strlen($json) . PHP_EOL;
echo 'json_encode() time: ' . ($end - $start) . PHP_EOL;
echo 'json_encode() memory: ' . memory_get_peak_usage(true) . PHP_EOL;

Вывод:

json_encode() string length: 15000001
json_encode() time: 0.19829201698303
json_encode() memory: 127401984

array_map(‘intval’, $array) vs. array_map(function($val) { … }, $array)

И я продолжаю серию своих никчемных исследований…

<?php
ini_set('memory_limit', '4096M');

$array = [];
for ($i = 0; $i < 1000000; $i++) {
    $array[$i] = (string)$i;
}

$start = microtime(true);
$tmp = array_map('intval', $array);
$end = microtime(true);
echo 'array_map(\'intval\', $array): ' . ($end - $start) . PHP_EOL;

$start = microtime(true);
$tmp = array_map(function($value) {
    return (int)$value;
}, $array);
$end = microtime(true);
echo 'array_map(function($value) { ... }, $array): ' . ($end - $start) . PHP_EOL;
array_map('intval', $array): 0.47099804878235
array_map(function($value) { ... }, $array): 2.9696278572083

array_key_exists vs. isset

Очередное маленькое бесполезное исследование скорости работы двух похожих функций.

Код и результаты, как водится, ниже.

<?php

$array = range(0, 1000000, 3);

$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    array_key_exists($i, $array);
}
$end = microtime(true);
echo 'array_key_exists: ' . ($end - $start) . PHP_EOL;

$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    isset($array[$i]);
}
$end = microtime(true);
echo 'isset: ' . ($end - $start) . PHP_EOL;
array_key_exists: 0.13523197174072
isset: 0.055444002151489

function_exists vs. extension_loaded

Одно небольшое бесполезное исследование провел сегодня на работе по долгу службы. Код и результаты его выполнения ниже.

<?php

$functionExistsStart = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    function_exists('this_function_doesnt_exist');
}
$functionExistsEnd = microtime(true);

$extenstionLoadedStart = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    extension_loaded('this_extension_is_not_loaded');
}
$extenstionLoadedEnd = microtime(true);

echo 'function_exists ' .
    ($functionExistsEnd - $functionExistsStart) .
    PHP_EOL;

echo 'extension_loaded ' .
    ($extenstionLoadedEnd - $extenstionLoadedStart) .
    PHP_EOL;
function_exists 0.35822796821594
extension_loaded 0.40138292312622