| Измерение скорости работы скрипта |
Измерение скорости работы скрипта
Для каждого программиста рано или поздно становится важным определение "узких мест" при работе скрипта или всего проекта.
Особенно когда проект разростается - отслеживать самые медленные точки тяжело или практически невозможно.
Потому очень важно иметь удобный инструмент для мониторинга таких вещей. В этой статье я предлагаю написать класс, который будет отслеживать время работы отдельных участков PHP скриптов.
Сначала создадим сам класс, а потом сможем его применять во всех наших скриптах, для которых нужно установить время работы. Итак, класс выглядит следующим образом:
<?php
set_time_limit(0);
class timer
{
private $start_time;
private function get_time()
{
list($usec, $seconds) = explode(" ", microtime());
return ((float)$usec + (float)$seconds);
}
function start_timer()
{
$this->start_time = $this->get_time();
}
function end_timer()
{
return ($this->get_time() - $this->start_time);
}
}
?>
Назовем наш класс "timer.class.php" и рассмотрим его поближе. Первая строка "set_time_limit(0);" определяет максимальное время работы нашего скрипта.
Т.к. нам нужна максимальная точность - передаем в каестве параметра ноль. Дальше идет собственно обьявление класса timer. Ниже мы видим обьявление трех методов класса:
- get_time
- start_timer
- end_timer
Все просто настолько, насколько это нам необходимо. Первая функция возвращает текущее время, функция start_timer записывает текущее время в переменную $start_time, а функция end_timer
возвращает нам разницу между текущим временем и временем которое мы сохранили в переменной $start_time. Собственно класс очень простой, и долго останавливаться на нем мы небудем.
Гораздо интереснее можно использовать этот класс. Кроме того это делать можно почти в каждом большом скрипте,
достаточно всего лишь подключить ваш класс "timer.class.php" к скрипту, время работы которого вы хотите измерить. Для примера давайте измерим время выполнения двух методов сложения чисел:
Мы узнаем что работает быстрее:
Для этого напишем такой код:
<?php
include("timer.class.php");
$timer = new timer();
$z = 0;
//---------------------
$timer->start_timer();
//---------------------
for($i=0; $i<10000; $i++)
{
$z += $i;
}
$z = 0;
//----------------------
$firstTime = $timer->end_timer();
//----------------------
echo('Код "$z += $i" работал '.$firstTime.'с.<br />');
//---------------------
$timer->start_timer();
//---------------------
for($i=0; $i<10000; $i++)
{
$z = $z+$i;
}
$z = 0;
//----------------------
$secondTime = $timer->end_timer();
//----------------------
echo('Код "$z = $z+$i" работал '.$secondTime.'с.<br />');
?>
У меня получился такой результат:
Код "$z += $i" работал 0.00566005706787с.
Код "$z = $z+$i" работал 0.00641202926636с.
Получается что по производительности эти два варианта практически равны. Если же рассмотреть использование нашего класса здесь - то оно также не является сложным.
Сначала мы подключаем класс используя функцию include, далее создаем обьект класса: $timer = new timer();. Потом "засекаем" текущее время используя $timer->start_timer(); после этого могут идти функции/методы
вашего кода которые вы хотите проверить на скорость работы (я использовал цикл на 10 000 итераций для примера), а затем получаем время работы блока кода используя код $firstTime = $timer->end_timer();.
После чего в нашей переменной $firstTime будет содержаться время работы первоко цикла. Как вы видите сам класс довольно простой, и его использование не вызывает никаких трудностей.
Спасибо за внимание :)
Версия для печати |
|