Аргерих Л. О языке РНР. Часть 5. Страница 91


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

Останавливает заданный таймер или таймер по умолчанию, если имя не задано. Возвращает истекшее время работы таймера.