【簡単ガイド】PHPによる時間計測の3ステップ

PHPを用いた時間計測のプロセスを説明するイラストPHP
この記事は約8分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

皆さんがPHPでコーディングをしている時に、どの部分が最も時間を取っているのか気になったことはありませんか?

それを解明するための一つの手段が「時間計測」です。

この記事を読めば、PHPによる時間計測の方法を理解し、実際のコードでどのように適用するのかが分かるようになります。

●PHPによる時間計測とは

PHPによる時間計測とは、PHPのコードの一部または全体が実行されるのにどれくらいの時間がかかるかを計測することを指します。

これは、パフォーマンスチューニングやデバッグ、または単にコードがどれほど効率的に動作しているかを理解するために有用です。

○PHPで時間を計測する理由

時間計測は、あなたのコードがどの部分で最も時間を消費しているかを明らかにします。

これは、コードの最適化や、特定の処理が想定以上に時間がかかっている場合の問題解決に役立ちます。

また、大規模なアプリケーションのパフォーマンスを改善するための重要なステップでもあります。

●時間計測の基本的な方法

PHPで時間を計測する基本的な方法は、microtime関数を用いることです。

この関数は現在の Unix タイムスタンプをマイクロ秒まで返します。

○サンプルコード1:基本的な時間計測

基本的な時間計測のためのコードを紹介します。

この例ではmicrotimeを用いて計測を始めと終わりにマーキングし、その差分を計算して経過時間を得ています。

<?php
// 計測開始
$start = microtime(true);

// 計測したい処理
for ($i = 0; $i < 10000; $i++) {
    $a = $i * $i;
}

// 計測終了
$end = microtime(true);

// 経過時間を表示
$elapsed = $end - $start;
echo "経過時間: " . $elapsed . "秒";
?>

このコードは、1から10,000までの各数値の二乗を計算する処理にかかる時間を計測します。

microtime(true)で取得したタイムスタンプを元に、計測開始時と終了時の差分を求めることで経過時間を計算しています。

●時間計測の詳細な手法

基本的な時間計測方法に加えて、より詳細な時間計測を行う方法もあります。

例えば、一つのループ内の各処理にかかる時間を個別に計測したい場合などです。

○サンプルコード2:詳細な時間計測

このコードでは、10回のループの各イテレーションにかかる時間を計測します。

この例では各ループの開始と終了時にマーキングを行い、その差分を利用して経過時間を取得します。

<?php
for ($i = 0; $i < 10; $i++) {
    $start = microtime(true);

    // 計測したい処理
    $a = $i * $i;

    $end = microtime(true);
    $elapsed = $end - $start;
    echo "ループ" . ($i + 1) . "の経過時間: " . $elapsed . "秒\n";
}
?>

○サンプルコード3:ループの時間計測

次のコードでは、全体のループ時間と各ループ内の時間計測を一緒に行います。

この例では、全体の時間計測と各ループの時間計測を組み合わせて、詳細なパフォーマンス分析を行っています。

<?php
// 全体の計測開始
$totalStart = microtime(true);

for ($i = 0; $i < 10; $i++) {
    $loopStart = microtime(true);

    // 計測したい処理
    $a = $i * $i;

    $loopEnd = microtime(true);
    $loopElapsed = $loopEnd - $loopStart;
    echo "ループ" . ($i + 1) . "の経過時間: " . $loopElapsed . "秒\n";
}

// 全体の計測終了
$totalEnd = microtime(true);
$totalElapsed = $totalEnd - $totalStart;
echo "全体の経過時間: " . $totalElapsed . "秒";
?>

このコードでは、ループ全体の時間と各ループの時間を計測しています。

全体の時間計測はループの外側で、各ループの時間計測はループの内側で行っています。

これにより、全体のパフォーマンスと個々のパフォーマンスの両方を評価できます。

●時間計測の応用例

時間計測の技術は多くの応用例を持っています。

一つ目の応用例として、関数の実行時間を計測することが挙げられます。

関数が実行されるのにかかる時間を知ることは、パフォーマンス最適化やデバッグにおいて非常に重要です。

○サンプルコード4:関数の実行時間計測

このコードでは、特定の関数の実行時間を計測します。

この例ではmyFunctionという関数を定義し、その実行時間を計測しています。

<?php
function myFunction($n) {
    $sum = 0;
    for ($i = 0; $i < $n; $i++) {
        $sum += $i;
    }
    return $sum;
}

// 計測開始
$start = microtime(true);

// 関数の実行
myFunction(100000);

// 計測終了
$end = microtime(true);

// 経過時間を表示
$elapsed = $end - $start;
echo "関数の実行時間: " . $elapsed . "秒";
?>

このコードでは、1から指定した数値(この場合は100,000)までの合計を計算するmyFunctionという関数の実行時間を計測します。

関数の開始前と終了後でmicrotime(true)を取得し、その差分から実行時間を求めています。

次に、データベースクエリの実行時間を計測することも可能です。

これは、データベースのパフォーマンス最適化や問題の診断において役立ちます。

○サンプルコード5:データベースクエリの時間計測

このコードは、MySQLデータベースに対するクエリの実行時間を計測します。

PDO(PHP Data Objects)を利用してMySQLデータベースに接続し、クエリを実行してその時間を計測します。

<?php
// データベースへの接続
$dbh = new PDO('mysql:host=localhost;dbname=test', 'root', '');

// クエリの準備
$stmt = $dbh->prepare('SELECT * FROM users');

// 計測開始
$start = microtime(true);

// クエリの実行
$stmt->execute();

// 計測終了
$end = microtime(true);

// 経過時間を表示
$elapsed = $end - $start;
echo "クエリの実行時間: " . $elapsed . "秒";
?>

このコードでは、’users’テーブルから全てのデータを選択するクエリの実行時間を計測しています。

PDOを使ってデータベースに接続し、クエリを準備、実行し、その結果を取得します。

クエリの実行前と後でmicrotime(true)を取得し、その差分から実行時間を求めています。

●時間計測の注意点と対策

時間計測には多くの利点がありますが、一方で注意しなければならない点もあります。

具体的には、環境による影響、処理時間の分散、そして時間計測によるパフォーマンスへの影響です。

○注意点

第一に、環境による影響を受けるという点です。

同じコードでも、違うハードウェアやOS、PHPのバージョンにより、実行時間は大きく変わることがあります。

例えば、ローカル環境でテストした結果と、本番環境での結果が大きく異なる可能性があります。

これは特に、クラウド環境など、ハードウェアが共有されている環境で顕著です。

また、処理時間には分散があるということを理解しておく必要があります。

同じコードを何度も実行すれば、実行時間は毎回少しずつ違います。

これは、他のプロセスがCPUを占有したり、ガベージコレクションが発生したりすることによるものです。

そのため、時間計測は一回だけではなく、何度も行い、平均値や中央値を見ることが重要です。

○対策

上記の問題に対する対策として、まずは計測する環境を本番環境に近いものにすることです。

具体的には、同じハードウェア、OS、PHPのバージョンを使用するようにします。

クラウドサービスの場合は、同じインスタンスタイプを使用すると良いでしょう。

また、処理時間の分散を考慮するためには、同じコードを何度も実行し、その結果を統計的に分析することが有効です。

具体的には、平均値、中央値、最小値、最大値などを見ると良いでしょう。

これにより、一時的なパフォーマンスの変動を見落とすことなく、コードの真のパフォーマンスを把握することができます。

まとめ

この記事では、PHPによる時間計測の基本的な手法と詳細な手法、応用例、そして注意点と対策について説明しました。

この情報を元に、自身のPHPコードのパフォーマンスを計測し、最適化に活用することができるでしょう。

しかし、時間計測はあくまで一つのツールであり、全てのパフォーマンス問題を解決するわけではありません。

そのため、アプリケーションのパフォーマンスを向上させるためには、他の最適化手法と併用することが重要です。

時間計測はその一部であり、適切に使用すれば、より効率的なコードを書く上で有用なガイドラインとなります。