Как определить быстродействие скрипта
| Я уже несколько месяцев серьезно занимаюсь изучением php. И теперь стараюсь сделать так, чтобы скрипт не только работал правильно, но и быстро, так как время работы скрипта – существенный параметр. Вы ведь не хотите, чтобы пользователь долго ждал? Если знать время выполнения скрипта, то можно добиваться его максимального быстродействия. Тем самым мы сегодня немного затронем тему оптимизации. |
Я решил начать с определения времени. И в дальнейшем буду использовать этот приём, чтобы узнать, в какую сторону повлияло изменение кода на быстродействие скрипта.
Чтобы это реализовать, надо определить время перед началом выполнения скрипта и в конце выполнения.
Я нашёл функцию microtime(), которая возвращает кол-во секунд, прошедших с 1 января 1970 года. Причём результат достаётся в виде дробной и целой части. Если мы хотим отделить эти значения друг от друга, то надо воспользоваться функцией explode().
Тем самым мы разделим строку на части, которые вернутся в виде массива.
Для примера я написал простенький скрипт заполнения таблицы бд.
index.php
error_reporting(0);
include ‘connect.php’;
include ‘funcs.php’;
$q=0;
$min=0;
while($q<10) {
$q++;
$i=0;
$clear_table = "TRUNCATE TABLE `time`";
mysql_query($clear_table) or die("не удалось очистить таблицу (".mysql_error().")");
$start_time = ftime();
while($i<30000) {
$i++;
$sql2 = "INSERT INTO `time` VALUES(NULL,'$i')";
mysql_query($sql2) or die("не удалось добавить данные в бд (".mysql_error().")");
}
$end = ftime();
$result = $end - $start_time;
echo "<BR>".$q."-ая попытка: ".$result;
if ($q == 1 || $result < $min) {
$min = $result;
}
}
echo "<BR><BR> минимальное кол-во времени: ".$min;
?>
connect.php
$sqlhost="localhost";
$sqluser="root";
$sqlpass="";
$db="time";
mysql_connect($sqlhost,$sqluser,$sqlpass) or die("не удалось соединиться ".mysql_error().")");
mysql_select_db($db) or die("не удалось выбрать бд(".mysql_error().")");
?>
funcs.php
Расчёт времени я выделил в отдельную функцию. Как видите explode сохранила два значения в массив, элементы которого я потом просто сложил.
Как видите первый цикл while нужен, чтобы прогнать код, который нам интересен 10 раз. Так как каждый раз время отличается и нам необходимо минимальное значение. Почему минимальное? Потому что система в момент минимального времени была наименее загружена, а значит это время наиболее правдоподобно. А вообще можно было бы взять больше итераций – например, не 10, а 40. Тогда время было бы еще правдивее.
$begin_time = ftime(); здесь я запоминаю начало работы скрипта.
$end = ftime(); здесь конец работы.
$sql4 = “TRUNCATE TABLE `asd`”; здесь я делаю очистку таблицы, перед каждым новым прогоном скрипта.
$result = $end – $begin_time; потом я просто вычитаю из конечного времени начальное.
и ищу минимальное время всех попыток:
if ($q == 1 || $result < $min) {
$min = $result;
}
Как видите все предельно просто.




Декабрь 5th, 2008
Я нашёл функцию microtime(), которая возвращает кол-во секунд, прошедших с 1 января 1970 года. Причём результат достаётся в виде дробной и целой части. Если мы хотим отделить эти значения друг от друга, то надо воспользоваться функцией explode().
function ftime()
{
$timem = explode(‘ ‘,microtime());
$res = $timem [0]+$timem [1];
return $res;
}
ненене) Не нужно таких извращений. Если функции microtime() передать аргумент TRUE, то она сразу вернет веремя в виде числа (секунды с милисекундами)
microtime(true)
И тогда не нужна никакая function ftime()
$start_time = microtime(true);
… бла-бла
$end_time = microtime(true);
Декабрь 5th, 2008
Правильно. Только это справедливо для версии PHP5. Для версии PHP4 придется использовать ftime. Читаем документацию.
Декабрь 9th, 2008
дейсвтительно так. просто я изначально на PHP5 пишу
Декабрь 21st, 2009
Спасибо! Хорошая статья.
Ещё бы узнать по возможности, сколько ресурсов памяти использует скрипт, было бы совсем замечательно…
Декабрь 7th, 2011
Хорошая статья. Есть кстати простой способ на [ссылка]