🐈

PHPにおける実行速度比較のためのプログラム

2024/11/04に公開

以前Qiitaで載せた記事の続き

https://qiita.com/shimaMatz/items/9d6a760055abbdcd46ab

新卒社員との雑談から上記の記事を書いた。
その時の調査から速度も違うという記事があった。
自分は速度の実行速度の測り方がわからなかったので、調べてみました。

測定プログラム

例文でforとwhileのどちらの方が実行速度の比較をしましょう。

<?php
// タイム計測用の関数
function measureExecutionTime($callback) {
    $startTime = hrtime(true); // 現在の開始時間をナノ秒で格納
    $callback(); // 測定する処理を実行
    $endTime = hrtime(true); // 計測完了時の時間をナノ秒で格納

    // ナノ秒での差分を返す
    return $endTime - $startTime;
}

// for文のテストを行う関数
function compareForLoop() {
    $hoge = 0;
    for ($i = 0; $i < 1000; $i++) {
        $hoge += $i;
    }
}

// while文のテストを行う関数
function compareWhileLoop() {
    $hoge = 0;
    $i = 0;
    while ($i < 1000) {
        $hoge += $i++;
    }
}

// 10回の実行結果を格納するための配列
$results = [];

// for文とwhile文をそれぞれ10回実行して結果を格納
for ($i = 1; $i <= 10; $i++) {
    $results[$i]['for処理'] = measureExecutionTime('compareForLoop');
    $results[$i]['while処理'] = measureExecutionTime('compareWhileLoop');
}

// 結果の出力
echo "回数\tfor処理(ナノ秒)\twhile処理(ナノ秒)\n";
foreach ($results as $count => $result) {
    echo "{$count}回目\t"
        . number_format($result['for処理']) . "\t\t"
        . number_format($result['while処理']) . "\n";
}

?>

プログラム解説

  1. 時刻取得にhrtimeを使用した理由

調査した限り、時刻を取得する関数は、複数ありますが、プログラムの実行速度を測るのに向いてる関数は以下二つでした。

mictotimeのリファレンスを読む限り、

パフォーマンスの計測には、hrtime() を使うことをお勧めします。

というふうに記載されている以上、hrtime一択になります。
本当は、「なぜhrtimeの方を推奨しているのか」を調べるべきですが、
本記事は、あくまで、PHPにおける実行速度比較のためのプログラムであり、
PHPに重きを置いているため、PHPリファレンスが推奨しているという理由で留めます。

  1. ナノ秒比較の理由
    開発エンジニアの友人や先輩が少ないため、ChatGPTにプログラムの実行速度比較に適した秒数を聞いてみました。

一般的な基準

  • ウェブアプリケーションやユーザーインターフェース:ミリ秒(ms)単位での計測が一般的です。100ms以下が理想的で、遅延があるとユーザー体験が低下する可能性があります。
  • リアルタイムシステムやエンベデッドシステム:マイクロ秒(µs)単位の精度が求められることがあります。
  • アルゴリズムやCPUレベルのベンチマーク:マイクロ秒またはナノ秒(ns)単位が必要になることがあります。

今回は、アルゴリズムやCPUレベルのベンチマークが一番近いため、マイクロ秒または、ナノ秒単位で比較するようにしました。

さいごに

誤っているところ、気になるところがあれば、コメントください。

Discussion