Точный способ измерения времени выполнения 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
12 ответов
можно использовать microtime
функция для этого. От документация:
microtime
- возврат текущей метки времени Unix с микросекундами
если
get_as_float
установлено значениеTRUE
, потомmicrotime()
возвращает float, который представляет текущее время в секундах с эпохи Unix с точностью до ближайшей микросекунды.
пример использования:
$start = microtime(true);
while (...) {
}
$time_elapsed_secs = microtime(true) - $start;
можно использовать microtime(true)
следующим образом:
поместите это в начало вашего php-файла:
//place this before any script you want to calculate time
$time_start = microtime(true);
/ / ваш код скрипта идет сюда
// 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
.
можно использовать 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)
создать файл 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";
}
}
чем в начале вашего скрипта, после <?php
написать include 'loadtime.php'; $loadtime=new loadTime();
при загрузке страницы в конце будет написано "загружен в X секунд"
$start = microtime(true);
for ($i = 0; $i < 10000; ++$i) {
// do something
}
$total = microtime(true) - $start;
echo $total;
вот функция, которая раз выполнение любого фрагмента кода PHP, так же, как модуль timeit Python делает: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
Я думал, что поделюсь функцией, которую я собрал. Надеюсь, это сэкономит вам время.
первоначально он использовался для отслеживания времени текстового скрипта, поэтому вывод находится в текстовой форме. Но вы можете легко изменить его на 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
надеюсь, это поможет кому-то!
вот очень простой и короткий метод
<?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
?>
вот реализация, которая возвращает дробные секунды (т. е. 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);
}
}
Если вы хотите отобразить это время в секундах:
<?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();