Время выполнения скрипта php и php-функций

Сегодня узнаем, как измерять время выполнения скрипта php и отдельных php-функций.

Время выполнения скрипта php

Узнать время выполнения скрипта php очень просто, сначала засекаем время начала работы скрипта в переменной $start, функция getMicrotime() просто возвращает для удобства метку времени, а в конце работы скрипта считаем разницу вычитанием getMicrotime()-$start

function getMicrotime() {
  return microtime(true);
}
$start = getMicrotime();

....

//Здесь выполняется какой-то код приложения
.....

printf('Время работы скрипта  %.4F сек.', getMicrotime()-$start);

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

Время выполнения php-функций

Время выполнения array_key_exists() + switch() +  if else()

<?php
header("Content-Type: text/html; charset=utf-8");
setlocale(LC_ALL, array("ru_RU.CP1251", "ru_SU.CP1251", "ru_RU", "russian", "ru_SU", "ru"));

function getMicrotime() {
  return microtime(true);
}

$str = 'a:28:{s:2:"id";a:6:{s:4:"CODE";s:2:"id";s:4:"TYPE";s:5:"field";s:5:"VALUE";s:2:"ID";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";s:8:"REQUIRED";s:1:"Y";}s:9:"available";a:6:{s:4:"CODE";s:9:"available";s:4:"TYPE";s:5:"const";s:14:"CONTVALUE_TRUE";s:4:"true";s:15:"CONTVALUE_FALSE";s:5:"false";s:14:"USE_CONDITIONS";s:1:"Y";s:10:"CONDITIONS";a:3:{s:8:"CLASS_ID";s:9:"CondGroup";s:4:"DATA";a:2:{s:3:"All";s:3:"AND";s:4:"True";s:4:"True";}s:8:"CHILDREN";a:1:{i:0;a:2:{s:8:"CLASS_ID";s:15:"CondCatQuantity";s:4:"DATA";a:2:{s:5:"logic";s:4:"EqGr";s:5:"value";d:1;}}}}}s:3:"url";a:5:{s:4:"CODE";s:3:"url";s:4:"TYPE";s:5:"field";s:5:"VALUE";s:15:"DETAIL_PAGE_URL";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:5:"price";a:6:{s:4:"CODE";s:5:"price";s:4:"TYPE";s:5:"field";s:5:"VALUE";s:23:"CATALOG:CATALOG_GROUP_1";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";s:8:"REQUIRED";s:1:"Y";}s:8:"oldprice";a:5:{s:4:"CODE";s:8:"oldprice";s:4:"TYPE";s:5:"field";s:5:"VALUE";s:0:"";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:10:"currencyId";a:6:{s:4:"CODE";s:10:"currencyId";s:4:"TYPE";s:5:"field";s:5:"VALUE";s:12:"CURRENCY:RUB";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";s:8:"REQUIRED";s:1:"Y";}s:10:"categoryId";a:6:{s:4:"CODE";s:10:"categoryId";s:4:"TYPE";s:5:"field";s:5:"VALUE";s:17:"IBLOCK_SECTION_ID";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";s:8:"REQUIRED";s:1:"Y";}s:7:"picture";a:4:{s:4:"CODE";s:7:"picture";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:5:"store";a:6:{s:4:"CODE";s:5:"store";s:4:"TYPE";s:5:"const";s:14:"CONTVALUE_TRUE";s:4:"true";s:15:"CONTVALUE_FALSE";s:5:"false";s:14:"USE_CONDITIONS";s:1:"Y";s:10:"CONDITIONS";a:3:{s:8:"CLASS_ID";s:9:"CondGroup";s:4:"DATA";a:2:{s:3:"All";s:3:"AND";s:4:"True";s:4:"True";}s:8:"CHILDREN";a:1:{i:0;a:2:{s:8:"CLASS_ID";s:15:"CondCatQuantity";s:4:"DATA";a:2:{s:5:"logic";s:4:"EqGr";s:5:"value";d:1;}}}}}s:6:"pickup";a:6:{s:4:"CODE";s:6:"pickup";s:4:"TYPE";s:5:"const";s:14:"CONTVALUE_TRUE";s:4:"true";s:15:"CONTVALUE_FALSE";s:5:"false";s:14:"USE_CONDITIONS";s:1:"Y";s:10:"CONDITIONS";a:3:{s:8:"CLASS_ID";s:9:"CondGroup";s:4:"DATA";a:2:{s:3:"All";s:3:"AND";s:4:"True";s:4:"True";}s:8:"CHILDREN";a:1:{i:0;a:2:{s:8:"CLASS_ID";s:15:"CondCatQuantity";s:4:"DATA";a:2:{s:5:"logic";s:4:"EqGr";s:5:"value";d:1;}}}}}s:8:"delivery";a:4:{s:4:"CODE";s:8:"delivery";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:10:"typePrefix";a:4:{s:4:"CODE";s:10:"typePrefix";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:6:"vendor";a:4:{s:4:"CODE";s:6:"vendor";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:10:"vendorCode";a:4:{s:4:"CODE";s:10:"vendorCode";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:5:"model";a:4:{s:4:"CODE";s:5:"model";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:11:"description";a:5:{s:4:"CODE";s:11:"description";s:4:"TYPE";s:5:"field";s:5:"VALUE";s:11:"DETAIL_TEXT";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:11:"sales_notes";a:4:{s:4:"CODE";s:11:"sales_notes";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:21:"manufacturer_warranty";a:4:{s:4:"CODE";s:21:"manufacturer_warranty";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:17:"country_of_origin";a:4:{s:4:"CODE";s:17:"country_of_origin";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:12:"downloadable";a:4:{s:4:"CODE";s:12:"downloadable";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:5:"adult";a:4:{s:4:"CODE";s:5:"adult";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:7:"barcode";a:4:{s:4:"CODE";s:7:"barcode";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:3:"cpa";a:4:{s:4:"CODE";s:3:"cpa";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:3:"rec";a:4:{s:4:"CODE";s:3:"rec";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:6:"expiry";a:4:{s:4:"CODE";s:6:"expiry";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:6:"weight";a:4:{s:4:"CODE";s:6:"weight";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:10:"dimensions";a:4:{s:4:"CODE";s:10:"dimensions";s:4:"TYPE";s:4:"none";s:14:"CONTVALUE_TRUE";s:0:"";s:15:"CONTVALUE_FALSE";s:0:"";}s:5:"param";a:4:{s:4:"CODE";s:5:"param";s:4:"TYPE";s:5:"const";s:14:"CONTVALUE_TRUE";s:12:"#PROPERTIES#";s:15:"CONTVALUE_FALSE";s:0:"";}}';
$arData = unserialize($str);
$result = false;


$start = getMicrotime();
for ($i=0; $i<=10000; $i++)
{
  foreach($arData as $key => $arField)
  {
    if(array_key_exists('id',$arField))
        $result = true;
    elseif(array_key_exists('available',$arField))
        $result = true;
    elseif(array_key_exists('url',$arField))
        $result = true;
    elseif(array_key_exists('price',$arField))
        $result = true;
    elseif(array_key_exists('oldprice',$arField))
        $result = true;
  }
}
printf('array_key_exists =  %.4F сек.<br>', getMicrotime()-$start);



$start = getMicrotime();
for ($i=0; $i<=10000; $i++)
{
  foreach($arData as $key => $arField)
  {
    switch($key)
    {
      case 'id':
        $result = true;
        break;
      case 'available':
        $result = true;
        break;
      case 'url':
        $result = true;
        break;
      case 'price':
        $result = true;
        break;
      case 'oldprice':
        $result = true;
        break;
    }
  }
}
printf('switch =  %.4F сек.<br>', getMicrotime()-$start);



$start = getMicrotime();
for ($i=0; $i<=10000; $i++)
{
  foreach($arData as $key => $arField)
  {
    if($key == 'id')
        $result = true;

    if($key == 'available')
        $result = true;

    if($key == 'url')
        $result = true;

    if($key == 'price')
        $result = true;

    if($key == 'oldprice')
        $result = true;
  }
}
printf('if else (1) =  %.4F сек.<br>', getMicrotime()-$start);



$start = getMicrotime();
for ($i=0; $i<=10000; $i++)
{
  foreach($arData as $key => $arField)
  {
    if($key == 'id')
        $result = true;
    elseif($key == 'available')
        $result = true;
    elseif($key == 'url')
        $result = true;
    elseif($key == 'price')
        $result = true;
    elseif($key == 'oldprice')
        $result = true;
  }
}
printf('if else (2) =  %.4F сек.<br>', getMicrotime()-$start);
?>

Результат
#


Очень полезно знать, часто встречающиеся ситуации, условие if else(2) самое быстрое.

Время выполнения str_ireplace() + preg_replace()

<?php
header("Content-Type: text/html; charset=utf-8");
setlocale(LC_ALL, array("ru_RU.CP1251", "ru_SU.CP1251", "ru_RU", "russian", "ru_SU", "ru"));

$text='ZTE мобильные Телефоны ZTE Blade GF3 (2 Sim-карты,4.5", 854x480,2 Камеры: 8,8 ГБ,GPS,Wi-Fi, Bluetooth,Android 5.0,черный телефон)';

function getMicrotime() {
  return microtime(true);
}

$start = getMicrotime();
for ($i=0; $i<=10000; $i++) {
  $text1 = str_ireplace(array('z','Тел','8'), array('*'), $text);
}
printf('str_ireplace(1) =  %.4F сек.<br>', getMicrotime()-$start);


$start = getMicrotime();
for ($i=0; $i<=10000; $i++) {
  $text1 = str_ireplace('z', '*', $text);
  $text1 = str_ireplace('Тел', '*', $text);
  $text1 = str_ireplace('8', '*', $text);
}
printf('str_ireplace(3) =  %.4F сек.<br>', getMicrotime()-$start);


$start = getMicrotime();
for ($i=0; $i<=10000; $i++) {
  $text1 = preg_replace('#z|Тел|8#i', '*', $text);
}
printf('preg_replace =  %.4F сек.<br>', getMicrotime()-$start);
?>
Результат
#

Часто читали на форумах, что preg_replace() очень медленный?)
А ведь, в каких-то ситуациях он и правда медленней str_ireplace(), а в каких-то наоборот, в разы быстрей, проверьте, убедитесь.

Заключение

Как видим, все надо проверять на деле, иначе приложение по нашей глупости или банальной лени может оказаться таким медленным, съедать у сервера всю память и нагружать процессор до красного каления...

Установка модуля