Точний спосіб вимірювання строків виконання php-скриптів


270

Хочеться знати, скільки мілісекунд займає цикл PHP для циклу.

Я знаю структуру загального алгоритму, але не знаю, як його реалізувати в 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

Якщо вам це потрібно у виробництві, ви можете поспілкуватися з фрагментами операторів microtime (), але якщо це просто для тестування, просто використовуйте , наприклад, профайлер xdebug . Жоден безладний код не є справжнім плюсом.
Wrikken

Відповіді:


525

Ви можете використовувати microtimeдля цього функцію. З документації :

microtime - Повернути поточну часову позначку Unix з мікросекундами


Якщо get_as_floatвстановлено значення TRUE, то microtime()повертає поплавок, який представляє поточний час у секундах з точної епохи Unix до найближчої мікросекунди.

Приклад використання:

$start = microtime(true);
while (...) {

}
$time_elapsed_secs = microtime(true) - $start;

36
Вам потрібно, microtime(true)якщо ви хочете робити обчислення зі зворотним значенням.
самотній день

7
Я знаю, що це занадто пізно (майже 4 роки), але як коментар ... використання цих обчислень (з параметром get_as_floatяк true) дасть результати за секунди , згідно з документацією PHP.
Алехандро Іван

6
@patrick, і ось що я сказав: якщо get_as_floatє true, microtime()повертає значення, що відображає секунди ...
Алехандро Іван

2
Хоча це дуже стара публікація, ми повинні посилатися на той факт, що повернутий поплавок містить мікросекунди ... Найкращим рішенням є розміщення разів на 1000 ... див . Приклад stackoverflow.com/questions/3656713/… . .
Сердитий 84

1
Ця відповідь застаріла. На сьогодні найкращий спосіб повідомити про час виконання сценарію - це один рядок в кінці коду: $time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; (Більше інформації у відповіді нижче .)
ashleedawg

84

Ви можете використовувати 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.


72

Ви можете використовувати 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функції


Це зручно знати. Тож ви можете скористатися:$start = $_SERVER["REQUEST_TIME_FLOAT"]; $myscript = microtime(true); $bootstrap = $myscript - $start; ...do stuff ...; $myscripttime = microtime(true) - $myscript;
pspahn

1
Цілком суть про використання цього полягає в тому, що ви могли просто зробити: $myscripttime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];наприкінці сценарію, не зберігаючи часову позначку на початку.
Івазару

1
Відповідно до зв'язаної документації, $timeбуде містити різницю в секундах , а не в мікросекундах .
Вім Деблауве

4
@WimDeblauwe Щоб уточнити, так результат за секунди. Але з мікросекундною точністю . наприклад, 1.1дорівнює 1 секунді + 100 мікросекунд.
Кріс Харрісон

1
Це найкращий спосіб виміряти час відгуку
Майк Арон

27

Створіть файл 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();

Коли сторінка завантажується в кінці, буде написано "Завантажено через х секунд"


5
Акуратно! Але якщо ви явно не знищите свій об’єкт, вихід з’явиться після закритого </html>тегу, який недійсний
Дмитро Пашкевич

@gondo Ні, це будуть секунди (мікросекунди виражаються у вигляді десяткових значень секунд)
FrancescoMM



7

Ось функція, яка в рази виконує будь-який фрагмент коду 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

Відмова: Я автор цього Суть

EDIT: timeit - це окремий самостійний проект за адресою https://github.com/flaviovs/timeit


5

Ви маєте правильну ідею, за винятком більш точних термінів, доступних за допомогою функції microtime () .

Якщо те, що знаходиться всередині циклу, швидко, можливо, очевидний минулий час буде нульовим. Якщо так, оберніть інший цикл навколо коду та зателефонуйте повторно. Не забудьте поділити різницю на кількість повторень, щоб отримати раз на раз. У мене є профільний код, який вимагав 10 000 000 ітерацій, щоб отримати стійкі, надійні результати часу.


3

Я думав, що поділюсь функцією, яку я зібрав разом. Сподіваємось, це може заощадити ваш час.

Спочатку він використовувався для відстеження термінів текстового сценарію, тому висновок знаходиться у текстовій формі. Але ви можете легко змінити його в 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

Сподіваюся, це комусь допоможе!


2

Ось дуже простий і короткий метод

<?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
?>

Я думаю, що ур пропустив щось, я перевірив цей код, коли я опублікував відповідь
Діпак Кумар

var_dump (мікрочас (вірно)); // float (1283846202.89) ось що, коли використовується microtime true
Deepak Kumar

Також ви можете використовувати float у загальному часі
Deepak Kumar

2

якщо ви хочете відобразити цей час у секундах:

<?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();

1

Ось реалізація, яка повертає дробові секунди (тобто 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);
    }
}

1

Ось мій сценарій для вимірювання середнього часу

<?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';

0

Ви можете знайти час виконання в секунду за допомогою однієї функції.

// ampersand is important thing here
function microSec( & $ms ) {
    if (\floatval( $ms ) == 0) {
        $ms = microtime( true );
    }
    else {
        $originalMs = $ms;
        $ms = 0;
        return microtime( true ) - $originalMs;
    }
}

// you don't have to define $ms variable. just function needs
// it to calculate the difference.
microSec($ms);
sleep(10);
echo microSec($ms) . " seconds"; // 10 seconds

for( $i = 0; $i < 10; $i++) {
    // you can use same variable everytime without assign a value
    microSec($ms);
    sleep(1);
    echo microSec($ms) . " seconds"; // 1 second
}

for( $i = 0; $i < 10; $i++) {
    // also you can use temp or useless variables
    microSec($xyzabc);
    sleep(1);
    echo microSec($xyzabc) . " seconds"; // 1 second
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.