Cara akurat untuk mengukur waktu eksekusi skrip php

270

Saya ingin tahu berapa milidetik yang diperlukan untuk dieksekusi oleh PHP-loop.

Saya tahu struktur algoritme generik, tetapi tidak tahu cara mengimplementasikannya dalam 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
DomingoSL
sumber
Anda dapat bermain-main dengan petak pernyataan microtime () jika Anda membutuhkan ini dalam produksi, tetapi jika itu hanya untuk pengujian, gunakan saja xdebug profiler misalnya. Tidak ada kode berantakan yang merupakan nilai tambah nyata.
Wrikken

Jawaban:

525

Anda dapat menggunakan microtimefungsi untuk ini. Dari dokumentasi :

microtime - Kembalikan stempel waktu Unix saat ini dengan mikrodetik


Jika get_as_floatdiatur ke TRUE, lalu microtime()mengembalikan float, yang mewakili waktu saat ini dalam detik sejak zaman Unix akurat ke mikrodetik terdekat.

Contoh penggunaan:

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

}
$time_elapsed_secs = microtime(true) - $start;
Tim Cooper
sumber
36
Anda perlu microtime(true)jika ingin melakukan perhitungan dengan nilai balik.
lonesomeday
7
Saya tahu ini waaaaaay terlambat (hampir 4 tahun), tetapi sebagai komentar ... menggunakan perhitungan ini (dengan parameter get_as_floatsebagai true) akan memberi Anda hasil dalam hitungan detik , menurut dokumentasi PHP.
Alejandro Iván
6
@ Patrick dan itulah yang saya katakan: jika get_as_floatada true, microtime()mengembalikan nilai yang mewakili detik ...
Alejandro Iván
2
Meskipun ini adalah posting yang sangat lama, kita harus merujuk pada kenyataan bahwa float yang dikembalikan memang mengandung mikrodetik ... Solusi terbaik adalah kali ini dengan 1000 ... lihat stackoverflow.com/questions/3656713/… sebagai contoh. .
Angry 84
1
Jawaban ini kedaluwarsa. Saat ini cara terbaik untuk melaporkan waktu eksekusi skrip adalah satu baris di akhir kode Anda: $time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; (Info selengkapnya dalam jawaban di bawah ini .)
ashleedawg
84

Anda dapat menggunakan microtime(true)sopan santun berikut:

Letakkan ini di awal file php Anda:

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

// kode skripmu ada di sini

// do something

Letakkan ini di akhir file php Anda:

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

Ini akan menampilkan hasil Anda minutes.

Aditya P Bhatt
sumber
72

Anda dapat menggunakan REQUEST_TIMEdari $_SERVERarray superglobal. Dari dokumentasi :

REQUEST_TIME
Stempel waktu dimulainya permintaan. (Tersedia sejak PHP 5.1.0.)

REQUEST_TIME_FLOAT
Stempel waktu dimulainya permintaan, dengan presisi mikrodetik . (Tersedia sejak PHP 5.4.0.)

Dengan cara ini Anda tidak perlu menyimpan cap waktu di awal skrip Anda. Anda bisa melakukannya:

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

Di sini, $timeakan berisi waktu yang telah berlalu sejak awal skrip dalam hitungan detik, dengan ketelitian mikrodetik (mis. 1.341Selama 1 detik dan 341 mikrodetik)


Info lebih lanjut:

Dokumentasi PHP : $_SERVERvariabel dan microtimefungsi

Iwazaru
sumber
Ini berguna untuk diketahui. Jadi Anda bisa menggunakan:$start = $_SERVER["REQUEST_TIME_FLOAT"]; $myscript = microtime(true); $bootstrap = $myscript - $start; ...do stuff ...; $myscripttime = microtime(true) - $myscript;
pspahn
1
Baik untuk keseluruhan tentang penggunaan ini adalah bahwa Anda hanya bisa melakukan: $myscripttime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];di akhir skrip Anda tanpa harus menyimpan cap waktu di awal.
Iwazaru
1
Menurut dokumentasi yang ditautkan, $timeakan berisi perbedaan dalam hitungan detik , bukan dalam mikrodetik .
Wim Deblauwe
4
@WimDeblauwe Untuk memperjelas, ya hasilnya dalam hitungan detik. Tetapi dengan presisi mikrodetik . misal 1.1sama dengan 1 detik + 100 mikrodetik.
Chris Harrison
1
Ini adalah cara terbaik untuk mengukur waktu respons
Mike Aron
27

Buat file 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";
    }
}

Daripada di awal skrip Anda, setelah <?phpmenulisinclude 'loadtime.php'; $loadtime=new loadTime();

Ketika halaman dimuat di akhir akan tertulis "Dimuat dalam x detik"

Omsarashvili Solo
sumber
5
Rapi! Tetapi jika Anda tidak secara eksplisit menghancurkan objek Anda, output akan muncul setelah </html>tag penutup yang tidak valid
Dmitry Pashkevich
@ Gondo Tidak, itu akan menjadi detik (dengan mikrodetik dinyatakan sebagai nilai desimal dari scecond)
FrancescoMM
19
$start = microtime(true);
for ($i = 0; $i < 10000; ++$i) {
    // do something
}
$total = microtime(true) - $start;
echo $total;
Dvir Azulay
sumber
7

Lihat microtime () .

patapizza
sumber
7

Berikut adalah fungsi yang kali mengeksekusi bagian kode PHP, seperti halnya modul timeit Python: https://gist.github.com/flaviovs/35aab0e85852e548a60a

Bagaimana cara menggunakannya:

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

Hasil:

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

Penafian: Saya adalah penulis dari Gist ini

EDIT: timeit sekarang menjadi proyek mandiri yang terpisah di https://github.com/flaviovs/timeit

flaviovs
sumber
5

Anda memiliki ide yang tepat, kecuali waktu yang lebih tepat tersedia dengan fungsi microtime () .

Jika apa yang ada di dalam loop cepat, ada kemungkinan bahwa waktu yang telah berlalu akan menjadi nol. Jika demikian, bungkus lingkaran lain di sekitar kode dan panggil berulang kali. Pastikan untuk membagi perbedaan dengan jumlah iterasi untuk mendapatkan waktu per-sekali. Saya telah membuat kode yang membutuhkan 10.000.000 iterasi untuk mendapatkan hasil yang konsisten dan dapat diandalkan.

wallyk
sumber
3

Saya pikir saya akan berbagi fungsi yang saya kumpulkan. Semoga ini bisa menghemat waktu Anda.

Ini awalnya digunakan untuk melacak waktu skrip berbasis teks, sehingga hasilnya dalam bentuk teks. Tetapi Anda dapat dengan mudah memodifikasinya menjadi HTML jika Anda mau.

Ini akan melakukan semua perhitungan untuk Anda untuk berapa banyak waktu yang telah dihabiskan sejak awal skrip dan di setiap langkah. Ini memformat semua output dengan 3 desimal presisi. (Turun ke milidetik.)

Setelah Anda menyalinnya ke bagian atas skrip Anda, yang Anda lakukan hanyalah meletakkan fungsi recordTime setelah setiap bagian yang Anda inginkan.

Salin ini ke bagian atas file skrip Anda:

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

Untuk melacak waktu yang berlalu, lakukan saja:

recordTime("What We Just Did")

Sebagai contoh:

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

Memberikan output seperti ini:

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

Semoga ini bisa membantu seseorang!

azoundria
sumber
2

Ini metode yang sangat sederhana dan singkat

<?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
sumber
Saya pikir Anda kehilangan sesuatu yang saya uji kode itu ketika saya memposting jawaban
Deepak Kumar
var_dump (microtime (true)); // float (1283846202.89) itulah yang terjadi ketika Anda menggunakan microtime true
Deepak Kumar
Anda juga dapat menggunakan pelampung total waktu
Deepak Kumar
2

jika Anda ingin menampilkan waktu itu dalam detik:

<?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();
Eugene Kaurov
sumber
1

Berikut ini adalah implementasi yang mengembalikan pecahan detik (yaitu 1,321 detik)

/**
 * 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);
    }
}
mils
sumber
1

Ini skrip saya untuk mengukur waktu rata-rata

<?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';
William Desportes
sumber
0

Anda dapat menemukan waktu eksekusi di tempat kedua dengan satu fungsi.

// 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
}
kodmanyagha
sumber