Для того чтобы определить разницу во времени, можно обратиться к методу, который используется в листинге 28.1. Записи, хранящиеся в массиве времени, содержат описание с последующим выводом функции microtime. Функция explode разбивает эти три значения, поэтому сценарий может отображать таблицу с временными значениями. В первом столбце таблицы хранится время в секундах, прошедшее с момента последнего ввода.
Листинг 28.1. Вычисление разницы во времени с помощью функции microtime

<?php
//время запуска
$clock[] = 'Start ' . microtime(); //сымитировать некое продолжительное вычисление $value = 0;
for($index = 0; $index < 10 00 0; $index++) {
$value += (cos(time()%pi()));
}
//время завершения $clock[] = 'cos ' . microtime(); //запись в файл
$fp = fopen("/tmp/data.txt", "w");
for($index = 0; $index < 10000; $index++)
{
fputs($fp, "Тестирование производительностиn"),•
}
fclose($fp); // время завершения
$clock[] = 'fputs ' . microtime(); // распечатать время $entry = explode(' ', $clock[0]); $lastVal = $entry[1] + $entry[2]; print('<table border="1">'),-foreach($clock as $c)
{
$entry = explode(' ', $c); print('<tr>');
print('<td>' . ($entry[1] + $entry[2] - $lastVal) . '</td>'),-
print('<td>' . $entry[0] . '</td>'),-
print('<td>' . ($entry[1] + $entry[2]) . '</td>');
print('</tr>');
$lastVal = $entry[1] + $entry[2];
}
print('</table>');
?>

 Вставка HTML-комментариев является моим любимым методом, поскольку он не требует никакой специальной подготовки. Слабой стороной его можно считать небольшой размер выборки. Я всегда делаю три-четыре загрузки страницы, чтобы исключить любую дисперсию, которая может быть вызвана кэшированием или обработкой сервером запросов от других задач в момент проведения тестирования. Web-сервер Apache имеет программу ApacheBench (или исполняемый файл ab), по­зволяющую решить эту проблему путем измерения количества запросов, которые способен обработать сервер. Программа ApacheBench делает несколько запросов по указанному адресу и составляет отчет о том, сколько времени это занимает. На рис. 28.2 показаны результаты обработки 1000 запросов для простого HTML-сценария. Строка, выделенная жирным шрифтом, - это команда, инициирующая получение отчета.
Я запросил HTML-документ для того, чтобы получить информацию об основных показателях производительности моего сервера. Любой PHP-сценарий должен работать медленнее, чем HTML-документ. Сравнение этих цифр дает мне представление о возможностях улучшения работы сценария. Если будет установлено, что сервер может обслужить PHP-сценарий со скоростью 10 запросов в секунду, то можно сделать вывод, что у меня есть большой простор для улучшения. При этом важно помнить, что ApacheBench работает на сервере, а это снижает влияние такого фактора, как перенос данных по сети, но при этом программа использует некоторое процессорное время. Проверку можно произвести и с другой машины и определить, таким образом, чистое время работы только Web-сервера.
По умолчанию программа ApacheBench производит одно подключение за одно обращение к ней. Если в аргументе -n указано значение 100, она сделает 100 последовательных подключений. В действительности Web-серверы обрабатывают одновременно множество запросов. Аргументом -c задается уровень параллельной работы. Так, например, -n 1000 -c 10 делает одну тысячу соединений при десяти активизированных запросах. Это помогает снизить количество обрабатываемых сервером запросов, но на более низких уровнях скорость реакции сервера будет зависеть от задержек, связанных со скоростью ответа аппаратной части, такой, например, как жесткие диски.
Программа ApacheBench является хорошим средством определения общей картины, но она не может определить, какая часть сценария тормозит работу всего сценария. Это также справедливо и в отношении накладных расходов, связанных с подключением к серверу и обработкой HTTP-кода. Однако это ограничение можно обойти, если внести изменения в сценарий.
Вставив комментарии в части и сравнивая рабочие характеристики, можно определить, какие части являются самыми медленными. С другой стороны, программу ApacheBench можно использовать с комментариями microtime.
Какой бы метод ни использовался, тестирование необходимо выполнять в определенном диапазоне значений. Если программа работает с пользовательским вводом, необходимо опробовать как простые, так и сложные случаи, концентрируясь при этом на общих случаях. Например, при тестировании программы, анализирующей текст из тега textarea, не ограничивайтесь вводом в форму нескольких слов. Вводите реальные данные, включающие большие значения, но не настолько большие, чтобы это выходило за рамки обычного использования. Люди редко вводят тексты мегабитами, а это может привести к существенному снижению рабочих характеристик, поэтому этого следует избегать.
Необходимо помнить о том, что измерения необходимо производить после любой модификации программы. Это позволит проконтролировать достижение поставленных целей. Если изменение ухудшает рабочие характеристики, то разумнее будет вернуться к ранней версии. Измерения подтвердят правильность сделанных изменений.
Эффективность и отладка