PHP 스크립트의 실행 시간을 측정하는 정확한 방법


270

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

프로덕션 환경에서 이것을 필요로하는 경우 microtime () 문을 사용하여 주위를 둘러 볼 수는 있지만 테스트 목적으로라면 xdebug의 프로파일 러 를 사용하십시오 . 지저분한 코드는 실제로 더할 나위가 없습니다.
Wrikken

답변:


525

microtime이 기능을 사용할 수 있습니다 . 에서 문서 :

microtime — 현재 Unix 타임 스탬프를 마이크로 초로 반환


get_as_float로 설정된 경우 , 유닉스 시대 이후 가장 가까운 마이크로 초 이후의 현재 시간을 초 단위로 나타내는 float TRUEmicrotime()반환합니다.

사용법 예 :

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

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

36
당신은 필요 microtime(true)하면 반환 값으로 계산을 수행하려는 경우.
lonesomeday

7
PHP 문서에 따르면, 이 계산이 너무 늦었 (거의 4 년)이지만 주석으로 ...이 매개 변수 get_as_float를 사용하여 이러한 계산을 사용하면 몇 초 만에 true결과를 얻을 수 있습니다.
Alejandro Iván

6
@patrick 그리고 그것은 내가 말한 것입니다 : get_as_floatis true이면 microtime()초를 나타내는 값을 반환합니다 ...
Alejandro Iván

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.3411 초 및 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 의 차이가 포함됩니다 .
Wim Deblauwe 2016 년

4
@WimDeblauwe 분명히 말하면, 결과는 몇 초 안에 있습니다. 그러나 마이크로 초 정밀도로 . 예를 들어 1.11 초 + 100 마이크로 초와 같습니다.
크리스 해리슨

1
이것은 응답 시간을 측정하는 가장 좋은 방법입니다
Mike Aron

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

페이지가 끝에로드되면 "Loaded in x seconds"라고 기록됩니다.


5
산뜻한! 그러나 객체를 명시 적으로 파괴하지 않으면 닫는 </html>태그 뒤에 잘못된 출력이 나타납니다.
Dmitry Pashkevich

@gondo 아니요, 초 단위입니다 (마이크로 초는 sceconds의 십진수 값으로 표시됨)
FrancescoMM

19
$start = microtime(true);
for ($i = 0; $i < 10000; ++$i) {
    // do something
}
$total = microtime(true) - $start;
echo $total;


7

다음은 Python의 timeit 모듈과 마찬가지로 PHP 코드의 일부를 실행하는 함수입니다. 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

면책 조항 : 나는이 요지의 저자입니다

편집 : timeit은 이제 https://github.com/flaviovs/timeit 에서 별도의 독립적 인 프로젝트입니다.


5

microtime ()을 사용하면보다 정확한 타이밍을 사용할 수 있다는 점을 제외하고는 올바른 아이디어가 있습니다. 함수 .

루프 내부의 내용이 빠르면 겉보기 경과 시간이 0 일 수 있습니다. 그렇다면 코드 주위에 다른 루프를 감싼 다음 반복해서 호출하십시오. 차이를 반복 횟수로 나누어 한 번에 시간을 확보하십시오. 일관되고 안정적인 타이밍 결과를 얻기 위해 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
?>

난 내가 답변을 게시 할 때 UR없는 뭔가 내가 그 코드를 테스트 한 생각
디팍 쿠마

var_dump (마이크로 타임 (true)); // 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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.