Измерить скорость скрипта на 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, Architect
PHP, JavaScript, Node.JS, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Моя книга
Книга. Веб-разработчик. Легкий вход в профессию
Печатная книга
Веб-разработчик.
Легкий вход в профессию
Купить за 159₽
Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

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