プログラムのパフォーマンスの最適化 |
PHP でプログラミングする最大の利点は、このプログラミング言語とその豊富なライブラリを簡単に学習できることです。使用する必要がある機能についてあまり知らなくても、特定のタスクを達成する方法を推測することができます。
PHP は非常にシンプルで学びやすいですが、PHP のプログラミング スキル、特にパフォーマンスとメモリ使用量に関連するスキルを学ぶには少し時間を費やす必要があります。 PHP には、メモリ使用量を削減し、アプリケーションのパフォーマンスを向上させるための工夫がたくさんあります。この記事では、PHP アプリケーションの分析、スクリプト コードの変更方法、および最適化前後のさまざまなパラメーター値の比較について簡単に紹介します。
プログラム内にタイミングプログラムを設定し、これらのコードを繰り返し実行することで、プログラムの実行速度に関する一連のデータを取得でき、このデータを使用してプログラムのボトルネックを発見し、パフォーマンスを最適化および改善することができます。アプリケーションのパフォーマンス。
おそらく読者は PEAR ライブラリについて聞いたことがあるでしょう。 PEAR ライブラリを使用して、分析中に使用する必要があるサンプルを作成します。これは、市販の製品を使用せずにコードを分析する最も簡単な方法でもあります。
使用するライブラリの名前は PEAR::Benchmark です。これは、コードの分析とパフォーマンス テストに非常に役立ちます。このライブラリは、ある関数呼び出しと次の関数呼び出しの間の時間を記録できる Benchmark_Timer() という名前のクラスを提供します。コードのパフォーマンスをテストすると、次のように非常に簡単な詳細なスクリプト実行結果を取得できます。
include_once("Benchmark/Timer.php");
$bench = new Benchmark_Timer; $bench->start();
$bench->setMarker('スクリプトの開始'); 数分間スリープ状態になります
$bench->stop(); //タイマーからプロファイリング情報を取得します
print_r($bench->getProfiling());
?>
上記コード実行後の出力は以下の通りです:
Array
(
[0] => Array
(
[name] => Start
[time] => 1013214253.05751200
[diff] => t ; スクリプトの開始
[time] => 1013214253.05761100
[diff] => 9.8943710327148 E-05
[合計] => 9.8943710327148 E-05
)
[2] =>配列
(
[名前] =>停止
[時間] => 1013214258.04920700
[差分] => 4.9915959835052
[合計] => 4.9916949272156
)
)
上 数値はばらばらの数値の集合のように見えるかもしれませんが、プログラムのサイズが大きくなると、これらの数値は非常に便利になります。
おそらく読者は、配列の最初のエントリが、
$bench->start()、$bench->setMarker()、$bench などの Benchmark_Timer() クラスを呼び出す実際のメソッドであることも推測できるでしょう。 ->stop()、これらのエントリに関連付けられた数値は非常に単純です。ここで、これらの数値を注意深く調べてみましょう:
[0] => Array
(
[name] => Start
[time ] => 1013214253.05751200
) [diff] => -
[total] => 0
)
time エントリは、Benchmark_Timer() の start() メソッドが呼び出されるときの UNIX タイムスタンプと diff エントリを示します。ここには前の呼び出しがないため、合計エントリは、テストの開始からこの特定の呼び出しまでにコードが実行された合計時間を指します。次の配列の出力を見てみましょう:
[1] => -05
[total] => 9.8943710327148E-05
)
上記の数値から、$bench-> を呼び出した後のことがわかります。 ;start()、$bench->setMarker(....) を呼び出すまで、プログラムは 9.8943710327148E-05 秒 (つまり、
0.0000989 秒) 実行されました。
実際のパフォーマンス テストの経験
上記の例は良い例ですが、サイトのコード設計を最適化する方法を決定する場合には、実際には良い例ではありません。以下では、Web サイト技術者としての私自身の個人的な経験を使用して、パフォーマンスの問題を解決する方法を説明します。
ウェブサイトで使用されているコードは、特別なニーズに基づいて長年にわたって開発されているため、よくわかりません━━モジュールの 1 つはウェブサイトの変換コードを含み、別のモジュールはウェブサイトの使用状況を記録し、その他のモジュールはまた、それぞれに独自の役割があります。 Web サイトの主な開発者と私は両方とも、Web サイトのコードを最適化する必要があることに気づきましたが、問題がどこにあるのかわかりませんでした。
できるだけ早くタスクを完了するために、Web サイトのメイン スクリプト コードの調査を開始し、すべてのスクリプト コードとそれに含まれるファイルにいくつかの $bench->setMarker() コマンドを追加して、次の出力を分析しました。 $bench->getProfiling() を実行したところ、何百回も使用された特定の言語名 (英語の en など) を取得するための変換コードに関連する関数呼び出しに問題があることがわかり、その結果に驚きました。各ページの回数。この関数が呼び出されるたびに、スクリプト コードは MySQL データベースにクエリを実行して、データベース テーブルから実際の言語名を取得します。
そこで、この種の情報用のバッファー システムを作成します。わずか 2 日間の作業でシステムのパフォーマンスが大幅に向上し、最初の 1 週間でページビュー数が 40% 増加しました。もちろん、これはコードを分析することでインターネット アプリケーションやインターネット Web サイトのパフォーマンスがどのように向上するかを示す一例にすぎません。
パフォーマンス テスト関数呼び出し
Benchmark_Timer() は、スクリプトまたは Web ページ (およびそれに含まれるファイル) を分析する場合に特に便利ですが、分析されたデータを取得するにはスクリプトを複数回ロードする必要があるため、科学的ではありません。特定のクラスまたは関数に対して呼び出されない。
PEAR:: Benchmark ライブラリの Benchmark_Iterator と呼ばれる別のクラスは、この問題をうまく解決でき、特定の関数またはクラス メソッドの分析情報を表示できます。その目的は、スクリプトを 1 回実行して 10 秒間実行されたとしても、毎回必ず 10 秒間実行されるわけではないことがわかっているため、テストから一貫した結果を取得できるようにすることです。
いずれにしても、いくつかの例を見てみましょう:
// データベースに接続するコード
include_once("DB.php");
$dsn = array(
'phptype' => 'mysql',
' hostspec' => 'localhost',
; 'database' => 'user_name',
; 'password' => $dbh = DB: :connect ($dsn); function getCreatedDate($id)
{
global $dbh; >$stmt = "SELECT created_date FROM users WHERE id=$id";
// ここで PEAR::DB を使用します
$created_date = $ dbh->getOne($stmt);
if ((PEAR::isError($created_date)) ||
(empty($created_date))) {
return false;
} else {
return $created_date;
}
}include_once 'Benchmark/Iterate.php';
$bench = new Benchmark_Iterate; // getDate関数を10回実行します
$bench->run(10, 'getCreatedDate', 1) // 分析情報を出力します
print_r( $bench->get());
?>
上記のコードを実行すると、次のような結果が生成されます。 0.001286029815 6738
[3] => 0.0010279417037964
[4] => 0.00093603134155273
[5] => 0.00094103813171387
[6] => 0.00092899799 346924
[7] => 0.0010659694671631
[8] => 0.00096404552459717
[9 ] => 0.0010690689086914
[10] => 0.00093603134155273
[mean] => 上記の数値は、getCre の 10 回の実行を表すと理解しやすいです。 atedDate() 関数。実際のテストでは、少なくとも 1000 回実行する必要がありますが、この例の結果は問題を説明するのに十分です。
結論
この記事を通じて、読者が PHP コードをすばやく分析する基本的な方法をマスターできることを願っています。ここで読者に、言語の多数の機能を習得する必要があるため、コードを分析するのは簡単な問題ではないことも思い出していただきたいと思います。コードにタイミング コードを追加すると、遅い関数を特定するのに役立ち、複数の反復を使用すると、コードを適切に最適化する方法を見つけることができます。