Точный способ измерения времени выполнения php-скриптов
Я хочу знать, сколько миллисекунд требуется для выполнения цикла PHP for-loop.
Я знаю структуру общего алгоритма, но не знаю, как реализовать его в PHP:
Begin
init1 = timer(); // where timer() is the amount of milliseconds from midnight
the loop begin
some code
the loop end
total = timer() - init1;
End
Ответы
Ответ 1
Для этого вы можете использовать функцию microtime
. Из документация:
microtime
- Возвращаемая временная метка Unix с микросекундами
Если для параметра get_as_float
установлено значение TRUE
, то microtime()
возвращает float, который представляет текущее время в секундах, начиная с эпохи Unix, с точностью до ближайшей микросекунды.
Пример использования:
$start = microtime(true);
while (...) {
}
$time_elapsed_secs = microtime(true) - $start;
Ответ 2
Вы можете использовать microtime(true)
со следующими способами:
Поместите это в начало вашего php файла:
//place this before any script you want to calculate time
$time_start = microtime(true);
//здесь идет ваш script код
// do something
Поместите это в конец вашего php файла:
// Display Script End time
$time_end = microtime(true);
//dividing with 60 will give the execution time in minutes other wise seconds
$execution_time = ($time_end - $time_start)/60;
//execution time of the script
echo '<b>Total Execution Time:</b> '.$execution_time.' Mins';
В результате вы получите результат minutes
.
Ответ 3
Вы можете использовать REQUEST_TIME
из суперглобального массива $_SERVER
. Из документации:
REQUEST_TIME
Отметка времени начала запроса. (Доступно с PHP 5.1.0.)
REQUEST_TIME_FLOAT
Отметка времени начала запроса с точностью до микросекунды. (Доступно с PHP 5.4.0.)
Таким образом, вам не нужно сохранять временную метку в начале вашего скрипта. Вы можете просто сделать:
<?php
// Do stuff
usleep(mt_rand(100, 10000));
// At the end of your script
$time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
echo "Did stuff in $time seconds\n";
?>
Здесь $time
будет содержать время, прошедшее с момента запуска скрипта в секундах, с точностью до микросекунд (например, 1.341
для 1 секунды и 341 микросекунд)
Больше информации:
Документация PHP: переменные $_SERVER
и функция microtime
Ответ 4
Создать файл loadtime.php
<?php
class loadTime{
private $time_start = 0;
private $time_end = 0;
private $time = 0;
public function __construct(){
$this->time_start= microtime(true);
}
public function __destruct(){
$this->time_end = microtime(true);
$this->time = $this->time_end - $this->time_start;
echo "Loaded in $this->time seconds\n";
}
}
Чем в начале вашего script, после <?php
напишите include 'loadtime.php'; $loadtime=new loadTime();
Когда страница загружается в конце, будет написано "Загружено за x секунд"
Ответ 5
$start = microtime(true);
for ($i = 0; $i < 10000; ++$i) {
// do something
}
$total = microtime(true) - $start;
echo $total;
Ответ 6
Смотрите microtime().
Ответ 7
Вот функция, которая выполняет выполнение любой части кода PHP, как и модуль времени Python timeit: https://gist.github.com/flaviovs/35aab0e85852e548a60a
Как использовать его:
include('timeit.php');
const SOME_CODE = '
strlen("foo bar");
';
$t = timeit(SOME_CODE);
print "$t[0] loops; $t[2] per loop\n";
Результат:
$ php x.php
100000 loops; 18.08us per loop
Отказ от ответственности: я являюсь автором этого Gist
EDIT: timeit теперь представляет собой отдельный автономный проект в https://github.com/flaviovs/timeit
Ответ 8
У вас есть правильная идея, кроме более точного выбора времени с помощью функции microtime().
Если то, что находится внутри цикла, быстро, возможно, что кажущееся прошедшее время будет равно нулю. Если это так, оберните еще один цикл вокруг кода и вызовите его повторно. Не забудьте разделить разницу на количество итераций, чтобы получить одноразовое время. У меня есть профилированный код, который требует 10 000 000 итераций, чтобы получить согласованные и надежные результаты синхронизации.
Ответ 9
Я думал, что разделю функцию, которую я собрал. Надеюсь, это поможет вам сэкономить время.
Первоначально он использовался для отслеживания времени выполнения текстового сценария, поэтому вывод осуществляется в текстовой форме. Но вы можете легко изменить его на HTML, если хотите.
Он сделает все расчеты за то, сколько времени было потрачено с момента запуска скрипта и на каждом шаге. Он форматирует весь вывод с точностью до 3 десятичных знаков. (До миллисекунд.)
После того, как вы скопируете его в начало вашего скрипта, все, что вы делаете, - это помещаете вызовы функции recordTime после каждого фрагмента, который хотите отсчитать.
Скопируйте это в начало вашего файла скрипта:
$tRecordStart = microtime(true);
header("Content-Type: text/plain");
recordTime("Start");
function recordTime ($sName) {
global $tRecordStart;
static $tStartQ;
$tS = microtime(true);
$tElapsedSecs = $tS - $tRecordStart;
$tElapsedSecsQ = $tS - $tStartQ;
$sElapsedSecs = str_pad(number_format($tElapsedSecs, 3), 10, " ", STR_PAD_LEFT);
$sElapsedSecsQ = number_format($tElapsedSecsQ, 3);
echo "//".$sElapsedSecs." - ".$sName;
if (!empty($tStartQ)) echo " In ".$sElapsedSecsQ."s";
echo "\n";
$tStartQ = $tS;
}
Чтобы отследить время, просто сделайте:
recordTime("What We Just Did")
Например:
recordTime("Something Else")
//Do really long operation.
recordTime("Really Long Operation")
//Do a short operation.
recordTime("A Short Operation")
//In a while loop.
for ($i = 0; $i < 300; $i ++) {
recordTime("Loop Cycle ".$i)
}
Дает вывод, как это:
// 0.000 - Start
// 0.001 - Something Else In 0.001s
// 10.779 - Really Long Operation In 10.778s
// 11.986 - A Short Operation In 1.207s
// 11.987 - Loop Cycle 0 In 0.001s
// 11.987 - Loop Cycle 1 In 0.000s
...
// 12.007 - Loop Cycle 299 In 0.000s
Надеюсь, это поможет кому-то!
Ответ 10
Вот очень простой и короткий метод
<?php
$time_start = microtime(true);
//the loop begin
//some code
//the loop end
$time_end = microtime(true);
$total_time = $time_end - $time_start;
echo $total_time; // or whatever u want to do with the time
?>
Ответ 11
если вы хотите отобразить это время в секундах:
<?php
class debugTimer
{
private $startTime;
private $callsCounter;
function __construct()
{
$this->startTime = microtime(true);
$this->callsCounter = 0;
}
public function getTimer(): float
{
$timeEnd = microtime(true);
$time = $timeEnd - $this->startTime;
$this->callsCounter++;
return $time;
}
public function getCallsNumer(): int
{
return $this->callsCounter;
}
}
$timer = new debugTimer();
usleep(100);
echo '<br />\n
'.$timer->getTimer(). ' seconds before call #'.$timer->getCallsNumer();
usleep(100);
echo '<br />\n
'.$timer->getTimer(). ' seconds before call #'.$timer->getCallsNumer();
Ответ 12
Здесь реализация, которая возвращает доли секунды (то есть 1.321 секунды)
/**
* MICROSECOND STOPWATCH FOR PHP
*
* Class FnxStopwatch
*/
class FnxStopwatch
{
/** @var float */
private $start,
$stop;
public function start()
{
$this->start = self::microtime_float();
}
public function stop()
{
$this->stop = self::microtime_float();
}
public function getIntervalSeconds() : float
{
// NOT STARTED
if (empty($this->start))
return 0;
// NOT STOPPED
if (empty($this->stop))
return ($this->stop - self::microtime_float());
return $interval = $this->stop - $this->start;
}
/**
* FOR MORE INFO SEE http://us.php.net/microtime
*
* @return float
*/
private static function microtime_float() : float
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
}
Ответ 13
Вот мой скрипт для измерения среднего времени
<?php
$times = [];
$nbrOfLoops = 4;
for ($i = 0; $i < $nbrOfLoops; ++$i) {
$start = microtime(true);
sleep(1);
$times[] = microtime(true) - $start;
}
echo 'Average: ' . (array_sum($times) / count($times)) . 'seconds';