PHPでパフォーマンス調査する時に使うクラス作ってみた

画面の表示が遅いウェブサイトを調査する時、

デバッグでmicrotime()なんかを使いながらどこが遅いか確認するんだけど、

そのために変数作ったりすると後から消し忘れる可能性もあるので専用のクラス作ってみた。

下記で記録開始。

StopWatch::getTime();

計測したいところにもこれ。

StopWatch::getTime();

最後画面に表示させるにはこれ。

StopWatch::getTime(TRUE);

表示する内容は、
・前回この関数を呼んだ時からの経過秒
・一番最初にこの関数を呼んだ時からの経過秒
・関数を呼んだファイル名と行数

こんな感じで使う(test.php)。

...

StopWatch::getTime();

sleep(2); //2秒経過

StopWatch::getTime();

sleep(3); //3秒経過

StopWatch::getTime();

sleep(1); //1秒経過

StopWatch::getTime(TRUE); //これで出力

結果こんなのが出力される。


0.00秒(0.00秒)@/test.php:3
2.00秒(2.00秒)@/test.php:7
3.00秒(5.00秒)@/test.php:11
1.00秒(6.00秒)@/test.php:15

以下、ソース。


/**
 * 時間計測用クラス
 *
 * パフォーマンス調査するためのクラス
 */
class StopWatch
{
  private $start; // 最初の時間
  private $last; // 前回の時間
  private $output; // 出力データ

  private function __construct($now)
  {
    $this->start = $now;
    $this->last = $now;
    $this->output = array();
  }

  final public function __clone()
  {
    throw new Exception('this is singleton class');
  }

  /**
   * 計測時間表示
   *
   * 前回メソッドを呼んだ時間からの経過時間と、
   * 最初にメソッドを呼んだ時間からの経過時間、
   * このメソッドを呼んだファイル名と行数を画面に表示します。
   *
   * フォーマット
   * [前回からの経過秒](最初からの経過秒])@[ファイル名]:[行数] : [追加事項]
   *
   * @access public
   * @param boolean $show 出力
   * @return 無し
   **/

  final public static function getTime($show = FALSE)
  {
    static $instance;
    
    $now = microtime(TRUE);

    if (!$instance) {
      $instance = new self($now);
    }

    $output = '';
    $output .= number_format($now - $instance->last, 2).'秒';
    $output .= '('.number_format($now - $instance->start, 2).'秒)';

    $back = debug_backtrace()[0];
    $output .= '@'.str_replace(__DIR__, '', $back['file']).':'.$back['line'];

    $instance->output[] = $output;
    $instance->last = $now;

    if ($show === TRUE)
    {
      echo implode('<br>', $instance->output);
      $instance->output = array();
    }
  }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です