PHPのパフォーマンスチューニングの過程で、スクリプトの実行時間とリソース消費を正確に測定することが非常に重要です。一般的な実践は、 MicroTime()とgetUsage()の2つの関数を組み合わせて、スクリプトのランタイムとシステムリソースの使用を監視することです。しかし、この方法は本当に信頼できますか?この記事では、これら2つがどのように使用されるかとその精度を詳細に説明します。
MicroTime()は、現在のUNIXタイムスタンプのマイクロ秒部分を返します。これは、高精度のタイミングによく使用されます。典型的な使用法は、スクリプトの先頭に一度呼び出してから、最後に一度呼び出すことです。 2つを引くと、スクリプトの実行時間が表示されます。
<?php
$start = microtime(true);
// シミュレーションの時間式操作
usleep(500000); // 500ミリ2番
$end = microtime(true);
$elapsed = $end - $start;
echo "スクリプト実行時間: {$elapsed} 2番\n";
?>
このアプローチの利点は、それがシンプルで簡単であり、ほとんどのPHPスクリプトのパフォーマンスを測定するのに十分な精度があることです。
getUsage()は、ユーザーCPU時間、システムCPU時間、メモリ使用量などを含む、現在のプロセスリソース使用量の配列を返します。
<?php
$usage_start = getrusage();
// シミュレーションの時間式操作
usleep(500000);
$usage_end = getrusage();
$user_cpu_start = $usage_start["ru_utime.tv_sec"] + $usage_start["ru_utime.tv_usec"] / 1e6;
$user_cpu_end = $usage_end["ru_utime.tv_sec"] + $usage_end["ru_utime.tv_usec"] / 1e6;
$user_cpu_time = $user_cpu_end - $user_cpu_start;
echo "ユーザーステータスCPU時間: {$user_cpu_time} 2番\n";
?>
ユーザー状態のCPUの時差を計算することにより、待機時間を含む全体的な実行時間ではなく、CPUが実際にスクリプトを処理するのにかかる時間を知ることができます。
誰かが両方を使用してスクリプトのパフォーマンスを判断します。
MicroTime()を使用して、合計時間(壁1時間時間)を計算します
getUsage()を使用して、CPU時間(ユーザー状態 +システム状態)を計算します
サンプルコード:
<?php
$start_time = microtime(true);
$start_usage = getrusage();
// シミュレーションの時間式操作
usleep(500000);
$end_time = microtime(true);
$end_usage = getrusage();
$elapsed_time = $end_time - $start_time;
$user_cpu_start = $start_usage["ru_utime.tv_sec"] + $start_usage["ru_utime.tv_usec"] / 1e6;
$user_cpu_end = $end_usage["ru_utime.tv_sec"] + $end_usage["ru_utime.tv_usec"] / 1e6;
$user_cpu_time = $user_cpu_end - $user_cpu_start;
$system_cpu_start = $start_usage["ru_stime.tv_sec"] + $start_usage["ru_stime.tv_usec"] / 1e6;
$system_cpu_end = $end_usage["ru_stime.tv_sec"] + $end_usage["ru_stime.tv_usec"] / 1e6;
$system_cpu_time = $system_cpu_end - $system_cpu_start;
echo "総時間消費: {$elapsed_time} 2番\n";
echo "ユーザーCPU時間: {$user_cpu_time} 2番\n";
echo "システムCPU時間: {$system_cpu_time} 2番\n";
?>
MicroTime()は、すべての待機時間とブロッキング時間を含む実際の期間を測定します。
getUsage()は、CPUの実際の処理時間を反映し、I/Oなどの待ち時間を排除することができ、CPUリソースのスクリプトの占有をより現実的に反映します。
2つを組み合わせることで、スクリプトの実行効率とシステムの負荷をより包括的に理解することができます。
getUsage()はすべてのオペレーティングシステムではサポートされておらず、Windows SystemsのPHPはこの機能を完全にサポートしていません。
getUsage()は、現在のプロセスリソースのみを測定し、外部呼び出しまたは子プロセスのリソース消費をカバーすることはできません。
スクリプトに大量のi/o待機またはネットワークリクエストが含まれている場合、CPU時間はリアルタイムからはほど遠いものであり、 getUsage()はI/Oボトルネックを反映できません。
MicroTime()はシステムクロックの精度の影響を受け、非常に短い時間の測定は不正確になる場合があります。
CPU集約型PHPスクリプトの場合、両方の測定を組み合わせることで、より正確なパフォーマンス情報を提供できます。
I/O集約型スクリプトの場合、 getTrusage()のみを使用するだけでは全体的なパフォーマンスを反映するのに十分ではなく、 MicroTime()がより重要です。
包括的な分析のために、他のパフォーマンスツール(Xdebug、Blackfireなど)を組み合わせることをお勧めします。
getTrusage()を使用する場合、特にクロスプラットフォーム環境で互換性の問題に注意してください。
getUsage()とmicroTime()には独自の利点があり、使用の組み合わせは実際にPHPスクリプトのパフォーマンスをより慎重に評価することができます。しかし、信頼できるかどうかは、特定の使用シナリオ、スクリプトの性質、テスト環境に依存します。それらは、全能の銀の弾丸ではなく、パフォーマンス分析のための基本的なツールです。ビジネス特性とより多くのパフォーマンスインジケーターを組み合わせることによってのみ、スクリプトパフォーマンスを科学的に判断および最適化できます。