echo($res1);
echo($res2); ?> •
Если эффективность этого сценария недостаточна, то подозрение может пасть на три объекта, первым из которых оказывается конструктор so- me__class( ), вызываемый при создании объекта $foo.
Второй и третий подозреваемые - два вызываемых метода. Весь сценарий выполняется 2,3 секунды, и надо определить, как это время распределяется между тремя подозреваемыми.
Некоторое подозрение падает еще на четвертого, - как долго выполняется require_once(), когда some_class() включает много методов. В интересах задач, обсуждаемых в этой главе, предположим, что вызов require_once() отнимает незначительную часть из 2,3 секунды времени выполнения сценария.
В РНР есть функция возвращающая количество секунд, истекших с
1970 года. Однако она едва ли нам поможет, поскольку сценарии, в большинстве своем, выполняются менее чем за секунду, а если время выполнения сценария измеряется секундами, нужна намного большая точность, чтобы понять, на что тратится время. Точность эту обеспечивает функция microtimeO.
Функция microtime
Эта функция возвращает строку вида msec sec, где msec представляет составляющую в микросекундах, a sec - количество секунд после 1970 года, например:
<?php
echo(microtimeO);
?>
Результат может быть таким:
0.15672253 987612546
Это не очень удобно для вычисления разницы во времени, поэтому результат можно обработать так:
<?php
$time_portions = explode(1 ', microtimeO);
$actual_time = $time_portions[1] . substr($time_portions[0], 1);
echo($actual_time); ?>
С помощью этого кода преобразуем
0.15672253 987612546
в
987612546.15672253
Теперь надо получить эти числа перед выполнением функции или участка кода и после и найти разность между ними. Для получения разности с достаточной точностью служит функция bc_sub():
<?php
$elapsed_time = bcsub($end_time, $start_time, 6);
Ш
Для выполнения этого сценария расширение bcmath надо скомпилировать с РНР с помощью параметра --enable-bc-math.
Здесь 6 указывает количество десятичных знаков, которое надо сохранить в результате.
Создание класса Timer
Заводить класс таймера при наличии средства профилирования РНР необязательно.
Этот класс поддерживает множественные таймеры. Далее описываются его основные функции:
• timerStart()
Запускаем новый таймер или оставляем его как таймер по умолчанию. Чтобы запустить таймер с определенным именем, вызываем ti-
mer_start('foo').
• timerStopO
Останавливает заданный таймер или таймер по умолчанию, если имя не задано. Возвращает истекшее время работы таймера.