Измерение скорости работы скрипта

Для каждого программиста рано или поздно становится важным определение "узких мест" при работе скрипта или всего проекта. Особенно когда проект разростается - отслеживать самые медленные точки тяжело или практически невозможно. Потому очень важно иметь удобный инструмент для мониторинга таких вещей. В этой статье я предлагаю написать класс, который будет отслеживать время работы отдельных участков 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. Ниже мы видим обьявление трех методов класса:
  1. get_time
  2. start_timer
  3. end_timer
  Все просто настолько, насколько это нам необходимо. Первая функция возвращает текущее время, функция start_timer записывает текущее время в переменную $start_time, а функция end_timer возвращает нам разницу между текущим временем и временем которое мы сохранили в переменной $start_time. Собственно класс очень простой, и долго останавливаться на нем мы небудем.
  Гораздо интереснее можно использовать этот класс. Кроме того это делать можно почти в каждом большом скрипте, достаточно всего лишь подключить ваш класс "timer.class.php" к скрипту, время работы которого вы хотите измерить. Для примера давайте измерим время выполнения двух методов сложения чисел:
Мы узнаем что работает быстрее:
  • $z += $i
  • $z = $z+$i
  Для этого напишем такой код:
 		<?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 будет содержаться время работы первоко цикла. Как вы видите сам класс довольно простой, и его использование не вызывает никаких трудностей. Спасибо за внимание :)


Автор: Макагон Сергей
Источник: http://devoid.com.ua



Опубликовал admin
6 Июл, Воскресенье 2008г.



Программирование для чайников.