Pers.narod.ru. PHP. Статьи. Класс для измерения временных промежутков и проверка существования функции |
Измерение временного промежутка, в течение которого исполняется тот или иной код - типовая задача, решаемая, в том числе, и на PHP. Один из вариантов современного подхода к такой задаче показывает небольшой класс CheckTimeInterval.php
, листинг которого приведён ниже:
<?php class CheckTimeInterval { public $start,$end; public function function_enabled($func) { //Функция проверки существования и доступности другой функции PHP //Параметры: $func - строка имени функции //На выходе: true - функция есть и доступна для вызова, // false - функция недоступна $func=strtolower(trim($func)); if ($func=='') return false; //Получить список функций, отключенных в php.ini $disabled=explode(",",@ini_get("disable_functions")); if (empty($disabled)) { $disabled=array(); } else { //Убрать пробелы и привести названия к нижнему регистру $disabled=array_map('trim',array_map('strtolower',$disabled)); } //Проверить доступность функции разными способами return (function_exists($func) && is_callable($func) && !in_array($func,$disabled)); } public function __construct () { if ($this->function_enabled('microtime')===false or version_compare(PHP_VERSION, '5.0.0', '<')) $this->start = false; else $this->begin(); } public function begin() { if ($this->start === false) return false; else { $this->start = microtime(true); return $this->start; } } public function end() { if ($this->start === false) return false; else { $this->end = microtime(true); return $this->end - $this->start; } } } ?>
Конструктор класса проверяет, доступна ли функция microtime
и установлена ли версия PHP не ниже 5. Дело в том, что стандартная microtime
может быть доступна не во всех операционных системах. Для проверки существования функции вызывается метод с именем function_enabled
- полагаю, его можно использовать и в других скриптах. Версия не ниже 5.0.0 нужна потому, что только в ней появился вызов функции microtime
с параметром true
, позволяющим вернуть из функции действительное число, которое можно затем интерпретировать как количество секунд. Обеспечить совместимость с младшими версиями PHP, впрочем, тоже несложно - вместо строк вида
$this->start = microtime(true);
достаточно поставить
$this->start = array_sum(explode(' ', microtime()));
- просто это будет работать медленнее и может исказить снятие меток времени.
Чтобы снять начальную метку времени повторно (для уже существующего экземпляра класса CheckTimeInterval
), можно вызвать метод begin
.
Чтобы получить прошедшее от начала измерения время в секундах, нужно вызвать метод end
.
Вот файл index.php
- тест класса, отвечающий на 2 типовых для PHP вопроса - отличается ли по быстродействию код с одинарными и двойными кавычками и дают ли выигрыш во времени стандартные функции обработки массивов (в данном случае - функция поиска по массиву с числовыми ключами 0,1,2...
)
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title>Тест класса CheckTimeInterval</title> </head><body> <?php require_once 'CheckTimeInterval.php'; $steps = 100000; echo 'Число шагов цикла: '.$steps; $s=''; $timer1 = new CheckTimeInterval (); if ($timer1->start===false) { echo '<br>Функция microtime(true) недоступна для Вашего сервера'; } else { for ($i=0; $i<$steps; $i++) $s.=$i; $time1=$timer1->end(); echo '<br>Формирование строки без двойных кавычек: '.$time1.' с.'; $s2=''; $timer2 = new CheckTimeInterval (); for ($i=0; $i<$steps; $i++) $s2.="$i"; $time2=$timer2->end(); echo '<br>Формирование строки с двойными кавычками: '.$time2.' с.'; for ($i=0; $i<$steps; $i++) $array[$i]=$i; $needle=$steps-1; $timer1->begin(); $key=array_search ($needle,$array); $time1=$timer1->end(); echo '<br>Поиск в массиве стандартной функцией: '.$time1.' с.'; $timer2->begin(); for ($i=0; $i<$steps; $i++) { if ($array[$i]==$needle) { $key=$i; break; } } $time2=$timer2->end(); echo '<br>Поиск в массиве "вручную": '.$time2.' с.'; } echo '<br><a href="index.php">Попробовать ещё раз</a> (результаты будут отличаться на разных тестах)'; ?> </body></html>
При первом запуске получилось следующее:
Число шагов цикла: 100000 Формирование строки без двойных кавычек: 0.0742630958557 с. Формирование строки с двойными кавычками: 0.0890390872955 с. Поиск в массиве стандартной функцией: 0.00933218002319 с. Поиск в массиве "вручную": 0.0216920375824 с.
Результаты будут отличаться при перезагрузках страницы - что там PHP кэширует и чем ещё заняты процессоры при выполнении скрипта - одному Богу известно.
При каком максимальном значении переменной $steps
скрипт будет работать - зависит от настройки memory_limit
в Вашем файле конфигурации php.ini
гостевая; E-mail |