18

ときどき、コードの 2 つのセグメント間の経過時間を測定できるようにしたいと考えています。これは、コード内のボトルネックを検出し、改善できるものを改善できるようにするためのものです。

関数が現在の呼び出しと最後に呼び出された時間の間の経過時間をエコーアウトするグローバル変数で動作するような関数を設計したいと思います。

このように、次々に何度も使用できます。

また、この関数は、0.1 秒や 0.3 秒などの秒単位の差を計算できる必要があります。

例はおそらくそれをよりよく説明するでしょう。

echo time_elapsed();   

     // This echo outputs nothing cause this is the starting case. 
     // There is nothing to compare against. 

//
// 1st code section here
//

echo time_elapsed();  

      // This echo outputs 0.5 seconds. 
      // ...which means there has been 0.5 seconds passed 
      // ...since the last time time_elapsed() was fired

//
// 2nd code section here
//


echo time_elapsed()   

      // This echo outputs 0.2 seconds

//
// 3rd code section here 
//

echo time_elapsed()   

      // This echo outputs 0.1 seconds etc

私の質問は、この種の出力を実現するためにどの PHP ユーティリティ (組み込み関数) を使用する必要があるかということです。

4

7 に答える 7

23

XDebug/Zend Debugger のようなデバッガーは、この種の洞察 (さらに多くのもの) を提供しますが、そのような関数を作成する方法のヒントを次に示します。

function time_elapsed()
{
    static $last = null;

    $now = microtime(true);

    if ($last != null) {
        echo '<!-- ' . ($now - $last) . ' -->';
    }

    $last = $now;
}

主に、時間計算を行うために必要なのは関数microtime()だけです。グローバル変数を避けるために、経過関数内で静的変数を使用します。または、必要な変数をカプセル化し、クラス メソッドを呼び出して時間値を追跡および出力できる単純なクラスを作成することもできます。

于 2012-06-27T22:00:53.730 に答える
15

php doc s の最初の例から:

<?php
/**
 * Simple function to replicate PHP 5 behaviour
 */
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

$time_start = microtime_float();

// Sleep for a while
usleep(100);

$time_end = microtime_float();
$time = $time_end - $time_start;

echo "Did nothing in $time seconds\n";
于 2012-06-27T22:00:24.770 に答える
9

これらの行に沿った何かが機能するはずです:

$start = microtime(true); 

// Do something
sleep(2);

$end = (microtime(true) - $start);
echo "elapsed time: $end";
于 2012-06-27T22:01:49.293 に答える
2

同じ draw010 関数 (ありがとう!)、カスタム コメントとマイクロ秒 (us) 単位の時間表示のみが追加されました。

    function time_elapsed($comment) 
        {

        static $time_elapsed_last = null;
        static $time_elapsed_start = null;

        // $unit="s"; $scale=1000000; // output in seconds
        // $unit="ms"; $scale=1000; // output in milliseconds
        $unit="μs"; $scale=1; // output in microseconds

        $now = microtime(true);

        if ($time_elapsed_last != null) {
            echo "\n";
            echo '<!-- ';
            echo "$comment: Time elapsed: ";
            echo round(($now - $time_elapsed_last)*1000000)/$scale;
            echo " $unit, total time: ";
            echo round(($now - $time_elapsed_start)*1000000)/$scale;
            echo " $unit -->";
            echo "\n";
        } else {
            $time_elapsed_start=$now;
        }

        $time_elapsed_last = $now;
    }               

例:

// Start timer
time_elapsed('');

// Do something
usleep(100);
time_elapsed('Now awake, sleep again');

// Do something
usleep(100);
time_elapsed('Game over');

出力:

<!-- Now awake, sleep again: Time elapsed: 100 us, total time: 100 us -->
<!-- Game over: Time elapsed: 100 us, total time: 200 us -->
于 2014-06-19T22:18:39.837 に答える
2

その他の要因は、スクリプトのタイミングに影響します。例:

  1. 複雑なコードと再帰関数。
  2. 使用されている Web サーバーのタイプ (例: 共有 VS 専用ホスティング)。
于 2012-06-27T22:04:03.493 に答える