Как определить быстродействие скрипта
Я уже несколько месяцев серьезно занимаюсь изучением php. И теперь стараюсь сделать так, чтобы скрипт не только работал правильно, но и быстро, так как время работы скрипта - существенный параметр. Вы ведь не хотите, чтобы пользователь долго ждал? Если знать время выполнения скрипта, то можно добиваться его максимального быстродействия. Тем самым мы сегодня немного затронем тему оптимизации. |
Я решил начать с определения времени. И в дальнейшем буду использовать этот приём, чтобы узнать, в какую сторону повлияло изменение кода на быстродействие скрипта.
Чтобы это реализовать, надо определить время перед началом выполнения скрипта и в конце выполнения.
Я нашёл функцию microtime(), которая возвращает кол-во секунд, прошедших с 1 января года. Причём результат достаётся в виде дробной и целой части. Если мы хотим отделить эти значения друг от друга, то надо воспользоваться функцией 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
function ftime()
{
$timem = explode(' ',microtime());
$res = $timem [0]+$timem [1];
return $res;
}
?>
Расчёт времени я выделил в отдельную функцию. Как видите 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;
}
Как видите все предельно просто.
Я нашёл функцию microtime(), которая возвращает кол-во секунд, прошедших с 1 января года. Причём результат достаётся в виде дробной и целой части. Если мы хотим отделить эти значения друг от друга, то надо воспользоваться функцией 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);
Правильно. Только это справедливо для версии PHP5. Для версии PHP4 придется использовать ftime. Читаем документацию.
дейсвтительно так. просто я изначально на PHP5 пишу
Спасибо! Хорошая статья.
Ещё бы узнать по возможности, сколько ресурсов памяти использует скрипт, было бы совсем замечательно…
Хорошая статья. Есть кстати простой способ на [ссылка]