php 処理速度とメモリ使用量(datetimeオブジェクト)

datetimeオブジェクトを使って処理速度とメモリ使用量を出力したい

作成日:2023-03-01, 更新日:2023-10-04

基本

PHP 文字を連結するときの処理速度とメモリ使用量の比較」を元にdatetimeオブジェクトで作り替え

サンプル

class Lib_Measurement {
    public $objDatetime_fst; // 開始日時のdatetimeオブジェクト
    public $objDatetime_nxt; // 処理開始前のdatetimeオブジェクト
    public $objDatetime_now; // 処理開始後のdatetimeオブジェクト
    public $objDatetime_diff; // 処理の開始前後の差分のdatetimeオブジェクト

    public $size_memory_fst; // 処理開始時のメモリサイズ
    public $size_memory_nxt; // 処理開始前のメモリサイズ
    public $size_memory_now; // 処理開始前のメモリサイズ
    public $size_memory_diff; // 処理の開始前後の差分のメモリサイズ

    public function __construct(){
        $this->objDatetime_fst = $this->objDatetime_nxt = new \DateTime();
        $this->size_memory_fst = $this->size_memory_nxt = memory_get_usage();
    }

    // 処理の前後の時間
    public function diffProcessTime(){
        $this->objDatetime_now = new \DateTime();
        $this->objDatetime_diff = $this->objDatetime_nxt->diff($this->objDatetime_now);

        // 書式でマイクロ秒が良い感じにならないので、手動計算
        $digit_microseconds = 1000000;
        $microseconds = 0;
        $microseconds += ($this->objDatetime_diff->days * 24 * 3600 * $digit_microseconds);
        $microseconds += ($this->objDatetime_diff->h * 3600 * $digit_microseconds);
        $microseconds += ($this->objDatetime_diff->i * 60 * $digit_microseconds);
        $microseconds += ($this->objDatetime_diff->s * $digit_microseconds);
        $microseconds += ($this->objDatetime_diff->f * $digit_microseconds);
        $microseconds /= $digit_microseconds;
        $microseconds = ($this->objDatetime_diff->invert ? '-': '+') . sprintf('%0.6f', $microseconds);

        $result_many = array(
            'before_at' => $this->objDatetime_nxt->format('Y-m-d H:i:s.u'), // 処理前の時刻+ミリ秒
            'after_at'  => $this->objDatetime_now->format('Y-m-d H:i:s.u'), // 処理後の時刻+ミリ秒
            'diff'      => $microseconds,
        );

        // 2023-10-04: 「format('%R%a.%f')」がよろしくない…
        // $result_many = array(
        //     'before_at' => $this->objDatetime_nxt->format('Y-m-d H:i:s.u'), // 処理前の時刻+ミリ秒
        //     'after_at'  => $this->objDatetime_now->format('Y-m-d H:i:s.u'), // 処理後の時刻+ミリ秒
        //     'diff'      => $this->objDatetime_diff->format('%R%a.%f'), // 「+-(%R)」の秒数(%a)とミリ秒(%f)
        // );

        $this->objDatetime_nxt = $this->objDatetime_now; // 次回用に書換え
        return $result_many;
    }

    // 処理の前後のメモリサイズ
    public function diffMemorySize(){
        $this->size_memory_now = memory_get_usage();
        $this->size_memory_diff = $this->size_memory_now - $this->size_memory_nxt;

        $result_many = array(
            'before_at' => number_format($this->size_memory_nxt).'byte', // 処理前のメモリサイズ
            'after_at'  => number_format($this->size_memory_now).'byte', // 処理後のメモリサイズ
            'diff'      => number_format($this->size_memory_diff).'byte', // メモリサイズの差分
        );

        $this->size_memory_nxt = $this->size_memory_now; // 次回用に書換え
        return $result_many;
    }
}

※「$this->objDatetime_fst」「$this->size_memory_fst」は基本、使わないけど…必要になったときのために用意

呼出し

$obj_measurement = new Lib_Measurement();

~ 何かの処理 ~

$proctime_many = $obj_measurement->diffProcessTime();
$memorysize_many = $obj_measurement->diffMemorySize();

var_dump($proctime_many);
var_dump($memorysize_many);

// 2回目以降はインスタンスの作成不要
~ 何かの処理 ~

$proctime_many = $obj_measurement->diffProcessTime();
$memorysize_many = $obj_measurement->diffMemorySize();

var_dump($proctime_many);
var_dump($memorysize_many);

関連項目