web-dev-qa-db-ja.com

ベンチマークPHPページの読み込み時間

ページの読み込みにかかる時間をどのように測定できますか(さまざまな異なるPHPステートメント))?

ここで利用可能な統計のように-- http://talks.php.net/show/drupal08/24

17
Anant

最も単純なのも Apache Benchabと呼ばれます)で、Apacheで提供されています:

  • これはコマンドラインツールです
  • これにより、多くのリクエストを並行してURLに送信できます
  • そして、タイミング、エラー、...を報告します。

スライドに表示される非常に単純なレポートの種類に適合しているようです。
(実際にはそれ以上のことを報告します)


ニーズがもう少し複雑な場合は、 Siege が良い選択肢になります。

Siegeの興味深い点は、URLを1つだけで処理するのではなく、ファイルからURLのリストを取得できることです。


これらのツールの興味深い点は、コードの特定の部分を実行するのにかかる時間だけを測定していないことです( microtime PHP code)に直接ありますが、ページを提供するために必要な時間全体を取得しています。

また、コード自体ではなくHTTPリクエストを処理しているため、PHPコード以上のベンチマークを実行できます。

11
Pascal MARTIN

これを行うには多くの方法があります。私は個人的に microtime を次のように使用するのが好きです:

// Start of code
$time = microtime(true); // Gets microseconds

// Rest of code

// End of code
echo "Time Elapsed: ".(microtime(true) - $time)."s";

これにより、マイクロ秒の精度が得られます。

コマンドラインスクリプト(Facebookパズルなど)を作成している場合は、時間だけを使用できます。

time php dancebattle.php ~/input.dat
Win

real    0m0.152s
user    0m0.142s
sys     0m0.012s

(ブラウザから)ページの読み込み時間を監視する方法を忘れてしまいました。 Firebug(Firefoxの場合)の[NET]タブを使用して、それを行うことができます。さまざまなファイルの読み込み(AJAX、JS、CSS、画像など)を監視できます。

43
  $ time curl http://www.example.com/

ネットワーク遅延を含むリクエスト全体の時間を計測することに注意してください。しかし、それはあなたが望むかもしれませんか?

9
Martin Wickman

試してください https://github.com/fotuzlab/appgati

コード内のステップを定義し、2つのステップ間の時間、メモリ使用量、サーバー負荷などを報告できます。

何かのようなもの:

    $appgati->Step('1');

    // Do some code ...

    $appgati->Step('2');

    $report = $appgati->Report('1', '2');
    print_r($report);

サンプル出力配列:

Array
(
    [Clock time in seconds] => 1.9502429962158
    [Time taken in User Mode in seconds] => 0.632039
    [Time taken in System Mode in seconds] => 0.024001
    [Total time taken in Kernel in seconds] => 0.65604
    [Memory limit in MB] => 128
    [Memory usage in MB] => 18.237907409668
    [Peak memory usage in MB] => 19.579357147217
    [Average server load in last minute] => 0.47
    [Maximum resident shared size in KB] => 44900
    [Integral shared memory size] => 0
    [Integral unshared data size] => 0
    [Integral unshared stack size] => 
    [Number of page reclaims] => 12102
    [Number of page faults] => 6
    [Number of block input operations] => 192
    [Number of block output operations] => 
    [Number of messages sent] => 0
    [Number of messages received] => 0
    [Number of signals received] => 0
    [Number of voluntary context switches] => 606
    [Number of involuntary context switches] => 99
)
4
fotuzlab

あなたは「ページの読み込み時間」を測定したいと言いますとは完全に異なります

  1. ページの生成にかかる時間(PHPコード)の内部タイマーで測定)

  2. サーバーからオフロードします(abで測定されます)

ページの読み込み時間には、HTMLを解析し、関連するすべてのコンテンツ(javascriptファイル、cssファイル、画像など)をフェッチするためにサーバーに後続のリクエストを行うのにかかる時間を含める必要があります。

これを測定することは実際には非常に困難です。これを適切に行うには、すべてのロジッククライアント側をプッシュする必要があります-ユーザーがリンクをクリックするかフォームを送信するときにタイムスタンプ付きのJavaScript Cookieをドロップし、次のページでonloadメソッド(すべてがロードされた後に起動します)を使用します今回を現在の時刻と比較しました。次に、このメトリックをサーバーに報告する方法が必要です。Ajaxリクエストを使用するか、別のCookieに時間を保存して、後続のリクエストで提示することができます。

各クライアントに必要なファイルは、ブラウザ側のキャッシュの現在の状態に依存することに注意してください。

クリックストリームをログから分離できる場合は、text/htmlコンテンツタイプのリクエストとtext/html以外のコンテンツタイプの最後の連続リクエストとの間の間隔を確認することで適切な概算を得ることができます。ただし、ユーザーが複数のブラウザウィンドウを同時に使用して対話すると、統計が歪められます。

2
symcbean

処理の開始時と出力の終了時に microtime() を使用して、差を計算し、必要に応じて秒に変換できます。

これは、PHP側の実行時間のみを測定し、リンク内にあるように見えるページの読み込み時間全体ではありませんが、たとえば、さまざまなメソッドのパフォーマンスを比較することができます。

2
Benoit
  1. 方法1:xdebugを使用します。
  2. 方法2:これらのステートメントをスクリプト全体に配置します

    $TIMER['label']=microtime(1);
    _/* some code */_
    $TIMER['sql1_before']=microtime(1);
    _a/* some code */_
    $TIMER['sql1_after']=microtime(1);
    _/* some code */_

次に、次のようなコードで出力します。

_  echo "<table border=1><tr><td>name</td><td>so far</td><td>delta</td><td>per cent</td></tr>";
  reset($TIMER);
  $start=$prev=current($TIMER);
  $total=end($TIMER)-$start;
  foreach($TIMER as $name => $value) {
    $sofar=round($value-$start,3);
    $delta=round($value-$prev,3);
    $percent=round($delta/$total*100);
    echo "<tr><td>$name</td><td>$sofar</td><td>$delta</td><td>$percent</td></tr>";
    $prev=$value;
  }
    echo "</table>";
_

したがって、コードがどのように処理されるかについての詳細なレポートが得られます。このアクションはprofilingと呼ばれ、最適化プロセスで最も重要な位置を占めます。

1

そのプレゼンテーションの出力はSiegeからコピーされているようです( http://www.joedog.org/index/siege-home )。

アプリケーションスタック全体の「実世界」のパフォーマンステストに非常に役立つもう1つのツールは、Firebug( http://getfirebug.com/ )とYSlow( http://developer.yahoo.com)です。/yslow /

0
MGriesbach

次のコードをPHPページの上部に配置します。

<?php
$statrttime = microtime();
$time = explode(' ', $statrttime);
$time = $time[1] + $time[0];
$start = $time;
?>

次のコードは、ページの最後に配置する必要があります。

<?php
$endtime = microtime();
$time = explode(' ', $endtime);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 4);
echo 'Page load in '.$total_time.' seconds.';
?>

注:コードの特定の部分の時間を測定する場合は、この正しい開始と最後のPHPコード部分を配置してください。

0
Shoaib Quraishi

Microtime()PHP関数を使用すると、PHPコードの実行に必要な時間を正確に知ることができます。以下の手順に従って、PHPコードをWebページに配置します。

次のコードをPHPページの最上部に配置します(コードの特定の部分に必要な時間を測定する場合は、これをPHPコード部分の直前に配置します)

<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$start = $time;
?>

次のコードは、Webページの最後(またはPHPコード部分の最後)に配置する必要があります。

<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 4);
echo 'Page generated in '.$total_time.' seconds.';

動作しない場合は、microtime()の代わりにmicrotime(true)を使用してください

0
Suneel Kumar