Измерение скорости (времени) выполнения php скрипта
Иногда бывает нужно замерить время выполнения отельного куска кода в PHP. Сделать это не сложно, ниже разберемся как.
Простой вариант
Замерить скорость выполнения какой-то отдельной его части PHP кода, можно с помощью встроенной в PHP функции microtime( true ). Функция вернет UNIX штамп времени в микросекундах. Параметр true говорит функции вернуть число, а не строку, чтобы можно было потом просто отнять одно число от другого.
Логика проста: сначала замеряем текущее время в микросекундах, выполняем код, опять замеряем текущее время и высчитываем разницу времени - эта разница и будет временем выполнения кода. С помощью функции sprintf() форматируем результат в более читаемый формат.
$start = microtime( true ); get_bloginfo( 'homeurl' ); // какой-то код $diff = sprintf( '%.6f sec.', microtime( true ) - $start ); echo "Время выполнения: $diff"; // Время выполнения: 0.000014 sec.
Вариант посложнее, но с доп функциональностью
Для измерения скорости работы PHP кода, когда-то написал такую функцию:
/**
* Считает время выполнения PHP кода (в секундах).
*
* exec_time();
* // код
* echo exec_time('get') .' сек.'; //> 0.03654 сек.
*
* @version 3.4.5
*
* @param string $phase run - включает подсчет: первый раз или после паузы (по умолчанию).
* start - очищает все кэши и включает подсчет - clear & run.
* get - получает разницу, между предыдущим вызовом функции.
* getall|end|stop - получает разницу, между первым вызовом функции (run).
* pause - временная остановка подсчета. exec_time() для продолжения.
* clear - полностью очищает результат. exec_time() для начала нового подсчета.
* @param int $round До скольки знаков после запятой округлять результат.
*
* @return float|void Example 0.03654
*/
function exec_time( $phase = 'run', $round = 6 ){
static $prev_time, $collect;
if( 'start' === $phase ){
$collect = $prev_time = 0;
}
elseif( 'clear' === $phase ){
return $collect = $prev_time = 0;
}
list( $usec, $sec ) = explode( ' ', microtime() );
$mctime = bcadd( $usec, $sec, 8 );
if( $prev_time ){
$exectime = $mctime - $prev_time; // bcsub( $mctime, $prev_time, 8 );
$collect += $exectime; // bcadd( $collect, $exectime, 8 );
}
$prev_time = $mctime;
if( 'pause' === $phase ){
$prev_time = 0;
}
elseif( 'get' === $phase ){
return round( $exectime, $round );
}
elseif( false !== strpos( 'getall end stop', $phase ) ){
return round( $collect, $round );
}
}
Если замеряете отдельные быстрые функции, например: __(), то можно повторять выполнение для наглядности. Например, замерим работу __():
exec_time();
for( $i=1; $i<50000; $i++ ){
$r = __( 'Settings', 'default' );
}
echo exec_time('get') .'сек.'; // 0.51650 сек.
--
Смотрите также, функции подсчета времени выполнения кода в WP:
—