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

       PHP      php      155    

Несколько способов узнать время выполнения скрипта PHP и затраченный объем памяти при выполнении этого скрипта.

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

Способ #1

Функция microtime() с переданным значением true возвращает число секунд, прошедших с полуночи 01.01.1970, причём это значение подсчитано до сотых долей секунды. Затем идёт сам скрипт (исполняемый код), который мы и проверяем. В последней строкой будет разница между текущим временем (после выполнения скрипта) и тем, что мы зафиксировали при старте скрипта. Разница времени после выполнения скрипта и времени до начала его работы, и есть время выполнения скрипта.

$start = microtime(true);

// исполняемый код ...

echo '<br>===============================================================';
echo 'Время выполнения скрипта: ' . (microtime(true) - $start) . ' sec.';

Результат:

Время выполнения скрипта: 0.16499996185303 sec.

Способ #2

Можно вместо $start = microtime(true) брать значение из переменной $_SERVER['REQUEST_TIME_FLOAT'], которая содержит время запроса к серверу. Вычисление времени выполнения происходит за исполняемым кодом.

// исполняемый код ...

$time = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'];
echo $time . ' sec.';

Способ #3

Если на сервере установлен Xdebag:

// исполняемый код ...

echo xdebug_time_index() . ' sec.';

Способ #4

Можно подсчитать среднее значение выполнения скрипта и записать результат в логи:

$start = microtime(true);
 
// исполняемый код ...
 
$time = round(microtime(true) - $start, 3);
 
$f = fopen('time.log', 'a');
fwrite($f, $time . PHP_EOL);
fclose($f);
 
$log = file('time.log');
$result = round(array_sum($log) / count($log), 3); 
echo $result . ' sec.';

Класс для получения времени выполнения скрипта

Очень простой класс, который можно использовать для получения времени выполнения скрипта PHP. Имеет приватное статическое свойство $start, в которой будет храниться время начала выполнения скрипта и имеющее значение по умолчанию $start = .0. Метод start() присваивает значение, которое вернула функция microtime свойству $start. Метод finish() возвращает разницу между текущим временем (после выполнения скрипта) и тем, что мы зафиксировали при старте скрипта (присвоили значение в $start).

<?php
/**
 * Класс для измерения времени выполнения скрипта PHP
 */
class Timer
{
  /**
   * @var float время начала выполнения скрипта
   */
  private static $start = .0;

  /**
   * Начало выполнения
   */
  public static function start()
  {
    self::$start = microtime(true);
  }

  /**
   * Разница между текущей меткой времени и меткой self::$start
   * @return float
   */
  public static function finish()
  {
    return microtime(true) - self::$start;
  }
}

Так используем класс:

Timer::start();

// исполняемый код ...

echo 'Время выполнения скрипта: ' . Timer::finish() . ' sec.';

// ===================================
// Пример использования класса Timer(). Заполним массив миллионом случайных чисел.
Timer::start();

for ($i = 0; $i < 1000000; $i++) {
  $array[] = rand(0, 1000000);
}
echo 'Время выполнения скрипта: ' . Timer::finish() . ' sec.';

Объем использованной памяти

Функция memory_get_usage() возвращает количество памяти в байтах, которое было выделено PHP скрипту на данный момент.

Принцип очень похож на измерение времени выполнения скрипта, о котором речь шла выше. Здесь тоже есть, как бы, стартовое состояние и и разница между текущим состоянием и стартовым.

$memory = memory_get_usage();
 
// исполняемый код ...
 
echo 'Скушано памяти: ' . (memory_get_usage() - $memory) . ' байт';

В Xdebug есть функция xdebug_memory_usage(), которая возвращает тот же результат.

// исполняемый код ...
 
echo 'Скушано памяти: ' . xdebug_memory_usage() . ' байт';

Результат:

Скушано памяти: 36018960 байт

Конвертация результата в килобайты и мегабайты

$memory = memory_get_usage();
 
for ($i = 0; $i < 1000000; $i++) {
  $array[] = rand(0, 1000000);
}
 
$memory = memory_get_usage() - $memory;
// Конвертация результата в килобайты и мегабайты 
$i = 0;
while (floor($memory / 1024) > 0) {
	$i++;
	$memory /= 1024;
}
 
$name = array('байт', 'КБ', 'МБ');
echo 'Скушано памяти: ' . round($memory, 2) . ' ' . $name[$i];

Результат:

Скушано памяти: 34 МБ

Время выполнения скрипта и объём потреблённой памяти

Timer::start();
$memory = memory_get_usage();

// начало исполняемого кода
for ($i = 0; $i < 1000000; $i++) {
  $array[] = rand(0, 1000000);
}
// конец исполняемого кода

$memory = memory_get_usage() - $memory;
$name = array('байт', 'КБ', 'МБ');
$i = 0;
while (floor($memory / 1024) > 0) {
  $i++;
  $memory /= 1024;
}

echo 'Время выполнения скрипта: ' . Timer::finish() . ' sec.<br>';
echo 'Скушано памяти: ' . round($memory, 2) . ' ' . $name[$i];

Результат:

Время выполнения скрипта: 0.79099988937378 sec.
Скушано памяти: 34 МБ
Комментарии временно оключены

Поиск

Популярное