Category: никчемное исследование

  • 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