วิธีที่แม่นยำในการวัดเวลาดำเนินการของสคริปต์ 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 () งบถ้าคุณต้องการนี้ในการผลิต แต่ถ้ามันเป็นเพียงสำหรับการทดสอบการใช้งานเพียงแค่Profiler xdebug ของตัวอย่างเช่น ไม่มีรหัสยุ่งเป็นบวกจริง
Wrikken

คำตอบ:


525

คุณสามารถใช้microtimeฟังก์ชั่นนี้ จากเอกสาร :

microtime - ส่งคืนเวลา Unix ปัจจุบันด้วย microseconds


หากget_as_floatตั้งค่าเป็นTRUEแล้วmicrotime()ส่งคืนทศนิยมซึ่งแสดงเวลาปัจจุบันในหน่วยวินาทีเนื่องจาก Unix epoch แม่นยำจนถึงไมโครวินาทีที่ใกล้ที่สุด

ตัวอย่างการใช้งาน:

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

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

36
คุณต้องการmicrotime(true)ถ้าคุณต้องการทำการคำนวณด้วยค่าส่งคืน
lonesomeday

7
ฉันรู้ว่านี่คือ waaaaaay สายเกินไป (เกือบ 4 ปี) แต่เป็นความคิดเห็น ... โดยใช้การคำนวณเหล่านี้ (พร้อมพารามิเตอร์get_as_floatเป็นtrue) จะให้ผลลัพธ์ในไม่กี่วินาทีตามเอกสาร PHP
Alejandro Iván

6
@ แพทริกและนั่นคือสิ่งที่ฉันกล่าวว่าถ้าget_as_floatเป็นtrue, microtime()ผลตอบแทนที่คุ้มค่าที่เป็นตัวแทนของวินาที ...
Alejandro Iván

2
แม้ว่านี่จะเป็นโพสต์ที่เก่ามาก แต่เราควรอ้างถึงข้อเท็จจริงที่ว่าการคืนค่าทศนิยมนั้นมีไมโครวินาที ... ทางออกที่ดีที่สุดคือคูณด้วย 1,000 ... ดูstackoverflow.com/questions/3656713/เป็นต้นเป็นตัวอย่าง .
Angry 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อาร์เรย์ superglobal จากเอกสาร :

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"];ในตอนท้ายของสคริปต์โดยไม่ต้องบันทึกการประทับเวลาตอนต้น
Iwazaru

1
ตามเอกสารที่เชื่อมโยง$timeจะมีความแตกต่างในวินาทีไม่ได้อยู่ในmicroseconds
Wim Deblauwe

4
@WimDeblauwe เพื่อชี้แจงใช่ผลเป็นวินาที แต่ด้วยไมโครแม่นยำ เช่น 1.1เท่ากับ 1 วินาที + 100 microseconds
Chris Harrison

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

เมื่อโหลดหน้าเสร็จจะมีการเขียน "โหลดใน x วินาที"


5
เรียบร้อย! แต่ถ้าคุณไม่ทำลายวัตถุของคุณอย่างชัดเจนผลลัพธ์จะปรากฏขึ้นหลังจาก</html>แท็กปิดซึ่งไม่ถูกต้อง
Dmitry Pashkevich

@gondo ไม่มันจะเป็นวินาที (โดยมีไมโครวินาทีแสดงเป็นค่าทศนิยมของ sceconds)
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

ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียนกระทู้นี้

แก้ไข: 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
?>

ฉันคิดว่าคุณพลาดสิ่งที่ฉันทดสอบรหัสนั้นเมื่อฉันโพสต์คำตอบ
Deepak Kumar

var_dump (microtime (จริง)); // float (1283846202.89) นั่นคือสิ่งที่เมื่อคุณใช้ microtime จริง
Deepak Kumar

นอกจากนี้คุณยังสามารถใช้ทุ่นลอยน้ำได้ตลอดเวลา
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.