二つの時刻を調べて結果を秒数で返すのに、DateTimeImmutable と strtotime のどちらが早いか調べてみた

PHP で日付や時刻を取得するには、date()関数やstrtotime()関数、DateTimeクラスやDateTimeImmutableクラスを用いると思います。
今回は、strtotime()関数とDateTimeImmutableクラスの処理速度を比較していきます。

DateTimeImmutableとは

DateTimeImmutableは日付や時刻を表すことができるクラスです。
DateTimeImmutableクラスで日付や時刻を取得するには、オブジェクトを作成します。
DateTimeImmutableクラスはDateTimeクラスとほぼ同じですが、 DateTimeImmutableクラスでは、作成したオブジェクトをメソッドで扱う際に、元のオブジェクトは変更せずに新しいオブジェクトを返します。
詳細はこちらをご覧ください。

使用例

下記を2021年6月28日の15時30分に実行します。

<?php
$datetime = new DateTimeImmutable('now', new DateTimeZone('Asia/Tokyo'));
echo $datetime->format('Y-m-d H:i:s'); //2021-06-28 15:30:24

strtotimeとは

strtotimeは指定日時をUnix タイムスタンプに変換するメソッドです。
Unix タイムスタンプの詳細に関してはこちらをご覧ください。

使用例

<?php
$unix_time = strtotime("2021-06-28 15:30:24");
echo $unix_time; //1624894224

実際にやってみる

今回は2021年4月18日21時15分42秒のUnix タイムスタンプと2021年4月18日21時25分32秒のUnix タイムスタンプの差を出す処理を10万回ループさせて実行速度を比較します。

<?php

//DateTimeImmutableの場合
$time_start = microtime(true);

$count = 0;
while($count <= 100000) {
    $datetime01 = new DateTimeImmutable("2021-04-18 21:15:42");
    $datetime02 = new DateTimeImmutable("2021-04-18 21:25:32");
    $diff = $datetime01->getTimestamp() - $datetime02->getTimestamp();
    $count++;
}

$time = microtime(true) - $time_start;
echo "{$time} 秒";


//strtotimeの場合
$time_start2 = microtime(true);

$count = 0;
while($count <= 100000) {
    $unix_time01 = strtotime("2021-04-18 21:15:42");
    $unix_time02 = strtotime("2021-04-18 21:25:32");
    $diff2 = $unix_time01 - $unix_time02;
    $count++;
}

$time2 = microtime(true) - $time_start2;
echo "{$time2} 秒";

結果

0.51721596717834 秒
0.29946088790894 秒

結果としては、strtotimeの方が実行速度が早く、10万回繰り返すと約0.2秒の差が生じることがわかりました。

ちなみに、DateTimeImmutableクラスにはふたつのDateTimeオブジェクトの差を返すdiff()関数というものがあるのでそちらの処理速度も出してみます。

<?php

$time_start1 = microtime(true);

$count = 0;
while($count <= 100000) {
    $datetime1 = new DateTimeImmutable("2021-04-18 21:15:42");
    $datetime2 = new DateTimeImmutable("2021-04-18 21:25:32");
    $diff1 = $datetime1->diff($datetime2);
    $durationInSeconds = ($diff1->s)
        + ($diff1->i * 60)
        + ($diff1->h * 60 * 60)
        + ($diff1->d * 60 * 60 * 24)
        + ($diff1->m * 60 * 60 * 24 * 30)
        + ($diff1->y * 60 * 60 * 24 * 365);
    $count++;
}

$time1 = microtime(true) - $time_start1;
echo "{$time1} 秒";

結果

0.52968621253967 秒

DateTimeImuutableのgetTimestamp()メソッドを使った処理とそこまで差がないことがわかりました。

参考サイト:

カテゴリーPHP

コメントを残す

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