Cách chính xác để đo thời gian thực hiện của các tập lệnh php


270

Tôi muốn biết một vòng lặp PHP cần bao nhiêu mili giây để thực thi.

Tôi biết cấu trúc của một thuật toán chung, nhưng không biết làm thế nào để triển khai nó trong 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

Bạn có thể sử dụng các câu lệnh microtime () nếu bạn cần điều này trong sản xuất, nhưng nếu nó chỉ để thử nghiệm, chỉ cần sử dụng trình lược tả của xdebug . Không có mã lộn xộn là một điểm cộng thực sự.
Wrikken

Câu trả lời:


525

Bạn có thể sử dụng microtimechức năng cho việc này. Từ tài liệu :

microtime - Trả về dấu thời gian Unix hiện tại với micro giây


Nếu get_as_floatđược đặt thành TRUE, sau đó microtime()trả về một số float, biểu thị thời gian hiện tại tính bằng giây kể từ thời điểm Unix chính xác đến micro giây gần nhất.

Ví dụ sử dụng:

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

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

36
Bạn cần microtime(true)nếu bạn muốn làm các phép tính với giá trị trả về.
lonesomeday

7
Tôi biết điều này là waaaaaay quá muộn (gần 4 năm), nhưng như một nhận xét ... sử dụng các tính toán này (với tham số get_as_floattrue) sẽ cho bạn kết quả sau vài giây , theo tài liệu PHP.
Alejandro Iván

6
@patrick và đó là những gì tôi đã nói: nếu get_as_floattrue, microtime()trả về giá trị đại diện cho giây ...
Alejandro Iván

2
Mặc dù đây là một bài viết rất cũ, chúng ta nên đề cập đến thực tế là số float được trả lại có chứa micro giây ... Giải pháp tốt nhất là nhân số này lên 1000 ... xem ví dụ stackoverflow.com/questions/3656713/ . .
Tức giận 84

1
Câu trả lời này đã hết hạn. Ngày nay, cách tốt nhất để báo cáo thời gian thực thi tập lệnh là một dòng duy nhất ở cuối mã của bạn: $time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; (Thông tin thêm trong câu trả lời bên dưới .)
ashleedawg

84

Bạn có thể sử dụng microtime(true)với cách cư xử sau:

Đặt cái này vào đầu tập tin php của bạn:

//place this before any script you want to calculate time
$time_start = microtime(true);

// mã script của bạn ở đây

// do something

Đặt cái này ở cuối tập tin php của bạn:

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

Nó sẽ xuất ra kết quả bạn minutes.


72

Bạn có thể sử dụng REQUEST_TIMEtừ $_SERVERmảng siêu lớp. Từ tài liệu :

REQUEST_TIME
Dấu thời gian bắt đầu của yêu cầu. (Có sẵn từ PHP 5.1.0.)

REQUEST_TIME_FLOAT
Dấu thời gian bắt đầu của yêu cầu, với độ chính xác micro giây . (Có sẵn từ PHP 5.4.0.)

Bằng cách này, bạn không cần lưu dấu thời gian ở đầu tập lệnh. Bạn chỉ có thể làm:

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

Ở đây, $timesẽ chứa thời gian trôi qua kể từ khi bắt đầu tập lệnh tính bằng giây, với độ chính xác micro giây (ví dụ: 1.341trong 1 giây và 341 micro giây)


Thêm thông tin:

Tài liệu PHP : $_SERVERcác biếnmicrotimehàm


Điều này là tiện dụng để biết. Vì vậy, bạn có thể sử dụng:$start = $_SERVER["REQUEST_TIME_FLOAT"]; $myscript = microtime(true); $bootstrap = $myscript - $start; ...do stuff ...; $myscripttime = microtime(true) - $myscript;
pspahn 24/2/2015

1
Vâng, toàn bộ quan điểm về việc sử dụng điều này là bạn có thể làm: $myscripttime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];ở cuối tập lệnh của bạn mà không phải lưu dấu thời gian ở đầu.
Iwazaru

1
Theo các tài liệu được liên kết, $timesẽ chứa sự khác biệt tính bằng giây chứ không phải tính bằng micro giây .
Wim Deblauwe

4
@WimDeblauwe Để làm rõ, có kết quả là trong vài giây. Nhưng với độ chính xác micro giây . ví dụ 1.1tương đương với 1 giây + 100 micro giây.
Chris Harrison

1
Đây là cách tốt nhất để đo thời gian phản hồi
Mike Aron

27

Tạo tập tin 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";
    }
}

Hơn trong việc cầu xin kịch bản của bạn, sau khi <?phpviếtinclude 'loadtime.php'; $loadtime=new loadTime();

Khi trang được tải ở cuối, sẽ có ghi "Đã tải trong x giây"


5
Khéo léo! Nhưng nếu bạn không phá hủy rõ ràng đối tượng của mình, đầu ra sẽ xuất hiện sau </html>thẻ đóng không hợp lệ
Dmitry Pashkevich

@gondo Không, sẽ mất vài giây (với micro giây được biểu thị bằng giá trị thập phân của giây)
FrancescoMM

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


7

Đây là một hàm có thời gian thực thi bất kỳ đoạn mã PHP nào, giống như mô-đun thời gian của Python hiện: https://gist.github.com/flaviovs35aab0e85852e548a60a

Làm thế nào để sử dụng nó:

include('timeit.php');
const SOME_CODE = '
        strlen("foo bar");
';
$t = timeit(SOME_CODE);
print "$t[0] loops; $t[2] per loop\n";

Kết quả:

$ php x.php 
100000 loops; 18.08us per loop

Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của Gist này

EDIT: timeit hiện là một dự án độc lập, riêng biệt tại https://github.com/flaviovs/timeit


5

Bạn có ý tưởng đúng, ngoại trừ thời gian chính xác hơn có sẵn với hàm microtime () .

Nếu những gì bên trong vòng lặp nhanh, có thể thời gian trôi qua rõ ràng sẽ bằng không. Nếu vậy, bọc một vòng lặp khác xung quanh mã và gọi nó nhiều lần. Hãy chắc chắn chia sự khác biệt cho số lần lặp để có được một lần một lần. Tôi đã mã hồ sơ yêu cầu 10.000.000 lần lặp để có kết quả thời gian nhất quán, đáng tin cậy.


3

Tôi nghĩ rằng tôi sẽ chia sẻ chức năng tôi đặt cùng nhau. Hy vọng nó có thể giúp bạn tiết kiệm thời gian.

Ban đầu nó được sử dụng để theo dõi thời gian của tập lệnh dựa trên văn bản, do đó đầu ra ở dạng văn bản. Nhưng bạn có thể dễ dàng sửa đổi nó thành HTML nếu bạn thích.

Nó sẽ thực hiện tất cả các tính toán cho bạn trong bao nhiêu thời gian đã được sử dụng kể từ khi bắt đầu tập lệnh và trong từng bước. Nó định dạng tất cả các đầu ra với 3 số thập phân chính xác. (Xuống đến mili giây.)

Khi bạn sao chép nó lên đầu tập lệnh của mình, tất cả những gì bạn làm là đặt các lệnh gọi hàm recordTime sau mỗi phần bạn muốn tính thời gian.

Sao chép này vào đầu tập tin kịch bản của bạn:

$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;
}

Để theo dõi thời gian trôi qua, chỉ cần làm:

recordTime("What We Just Did")

Ví dụ:

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)
}

Cung cấp đầu ra như thế này:

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

Hy vọng điều này sẽ giúp được ai đó!


2

Đây là phương pháp rất đơn giản và ngắn gọn.

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

Tôi nghĩ bạn thiếu thứ gì đó tôi đã kiểm tra mã đó khi tôi đăng câu trả lời
Deepak Kumar

var_dump (microtime (đúng)); // float (1283846202.89) đó là những gì khi bạn sử dụng microtime đúng
Deepak Kumar

Bạn cũng có thể sử dụng phao trong tổng thời gian
Deepak Kumar

2

nếu bạn muốn hiển thị thời gian đó tính bằng giây:

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

Đây là một triển khai trả về giây phân đoạn (tức là 1,321 giây)

/**
 * 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

Đây là kịch bản của tôi để đo thời gian trung bình

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

Bạn có thể tìm thấy thời gian thực hiện trong giây với một chức năng duy nhất.

// 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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.