Измерить скорость скрипта на PHP

Author Автор: Роман Чернышов    Опубликовано: 17 октября 2010

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

На помощь в написании оптимизированных собственных дополнений вам пригодиться небольшой PHP класс измерения времени выполнения скрипта, найденный мною на просторах интернета.

Для удобства назовем его: timer.class.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-&gt;start_time = $this-&gt;get_time();
}
 
function end_timer()
{
return ($this-&gt;get_time() - $this-&gt;start_time);
}
}
?&gt;

Как мы видим в этом классе используется три метода, все достаточно просто. Первый метода get_time возвращает текущее время, метода start_timer сохраняет текущее время в переменную $start_time, и наконец третий метод все это дело подсчитывает и возвращает нам разницы между текущим и сохраненным нами временем. Таким образом вычисляется время выполнения скрипта.

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

Первый вариант:

if (isset($str{5})) {}

Второй вариант:

if (strlen($str) &gt; 5) {}

Для проверки на скорость этих двух вариантов записи напишем следующий код:

&lt;?php
include("../../lib/timer.class.php");
 
$timer = new timer();
$str="привет мир";
 
//---------------------
$timer-&gt;start_timer();
//---------------------
 
for($i=0;  $i&lt;10000;  $i++)
{
if (isset($str{5})) {}
}
//----------------------
$firstTime = $timer-&gt;end_timer();
//----------------------
 
echo('Код "if (isset($str{5})) {}" работал '.$firstTime.'с.&lt;br /&gt;');
 
//---------------------
$timer-&gt;start_timer();
//---------------------
 
for($i=0;  $i&lt;10000;  $i++)
{
if (strlen($str) &gt; 5) {}
}
 
//----------------------
$secondTime = $timer-&gt;end_timer();
//----------------------
 
echo('Код "if (strlen($str) &gt; 5) {}" работал '.$secondTime.'с.&lt;br /&gt;');
?&gt;

После выполнения вышеописанного скрипта мы увидим результат, время выполнения двух разных вариантов записи оператора условий

Код «if (isset($str{5})) {}» работал 0.0011839866638184с.
Код «if (strlen($str) > 5) {}» работал 0.0032460689544678с.

Из этого видно, что первый вариант работает примерно в три раза быстрее. в скрипте используется цикл с количеством итераций (оборотов) 10 000, это сделано для того, чтобы видеть разницу в более наглядном примере.

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

Не отходя от темы, хочу упомянуть недавнее обсуждение статьи, опубликованной на Joomlaperformance, в которой как раз писалось об оптимизации и о скорости выполнения тех или иных вариантов написания кода. и к всеобщему удивлению была выявлена разница в описанных мною примерах кода, а именно, разница на 146% между  «if (isset($str{5})) {}" и «if (strlen($str) &gt; 5) {}».

Благодарю за внимание, учитесь писать правильный код.

5 комментариев to “Измерить скорость скрипта на PHP”

  • AlexanderC 09.05.2011 в 7:44 пп

    А если нузно таймер остановить ??? т.е. пропустить какой-то участок кода ???
    Диллема ))) … и по моему мнению лучше делать класс который будет полностью автоматичесский, чтобы было примерно так- new timer(и оно выводит на экран время)
    У меня по этой шеме работает класс кэширования сайта(в flat файлы). т.е. нужно только инициализировать класс (использует register_shutdown_function() )

  • Роман Чернышов 10.05.2011 в 12:26 дп

    Остановка таймера это уже отдельный вопрос, можно разумеется реализовывать данную возможность уже в виде отдельного класса.

  • Тарас 18.05.2011 в 11:51 пп

    Выложенный Вами класс не работает. В отличии от идентичного с другого сайта. Причина в строчке return ($this->get_time() – $this->start_time);
    Вместо минуса у Вас стоит тире.

    • Роман Чернышов 19.05.2011 в 2:26 дп

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

  • Gor 07.06.2011 в 10:45 пп

    Добавьте что это актуально для PHP ниже 5 версии.
    Для php5>
    функцию function get_time() можно просто заменить на microtime(true);
    ИМХО так быстрее сделать замер
    $StartTime=microtime(true);
    /*
    *Замеряемый кусок кода
    */
    $StartTime=microtime(true)-$StartTime;
    echo ‘Что то там отработало за’, $StartTime,’ сек.’;

Оставить комментарий

Автор блога
Чернышов Роман
Роман Чернышов
Веб-разработчик, Full Stack
Senior, Architector
PHP, JavaScript, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка