PHPスクリプトの実行時間を測定する正確な方法


270

PHPのforループの実行にかかる時間をミリ秒単位で知りたいのですが。

私は一般的なアルゴリズムの構造を知っていますが、それを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エポック秒で現在の時刻を表すfloatを返します。

使用例:

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

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

36
microtime(true)戻り値を使用して計算する場合に必要です。
lonesomeday

7
PHPのドキュメントによると、これは遅すぎる(ほぼ4年)ですが、コメントとして...これらの計算を(パラメータget_as_floatとしてtrue)使用すると、秒単位で結果が得られます。
AlejandroIván2015年

6
@patrickとget_as_floattrue、私が言ったことです。isの場合microtime()、秒を表す値を返します...
AlejandroIvánJul

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"];は、最初にタイムスタンプを保存しなくても、スクリプトの最後で次のことができるということです。
岩原2015年

1
リンクされたドキュメントによると、マイクロ秒単位ではなく、単位$timeの違いが含まれます
Wim Deblauwe 2016年

4
@WimDeblauwe明確にするために、はい、結果は秒単位です。しかし、マイクロ秒の精度で。たとえば 1.1、1秒+ 100マイクロ秒に相当します。
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();

ページが最後にロードされると、「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

免責事項:私はこの要旨の著者です

EDIT:はtimeitは、今では別の、自己完結型のプロジェクトですhttps://github.com/flaviovs/timeit


5

より正確なタイミングがmicrotime()関数で利用できることを除いて、あなたは正しい考えを持っています。

ループ内が高速である場合、見かけ上の経過時間がゼロになる可能性があります。その場合は、コードを別のループで囲み、繰り返し呼び出します。1回あたりの時間を取得するには、違いを反復回数で除算してください。一貫した信頼できるタイミング結果を得るために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(true)); // float(1283846202.89)は、microtime trueを使用する場合の意味
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

1つの関数で実行時間を秒単位で見つけることができます。

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