プログラム
PEAR::BenchMark をマスターしたので、コードをテストする方法、コードが速いか遅いか、どの部分が遅いかを判断する方法がわかりました。そこで次に話したいのは、遅いコードのその部分を削除または最適化する方法についてです。
現時点での私の個人的な経験の主なポイントは 2 つだけです。1 つは、間違ったループや非効率なループを排除することです。もう 1 つは、データベース クエリ ステートメントを最適化することです。実際、「str_replace は ereg_replace より速い」、「echo は print より速い」など、他にも最適化の詳細がいくつかあります。これらについてはひとまず脇に置き、頻繁すぎる IO に対処するためのキャッシュの使用については後ほど説明します。
以下では、同じ機能でプログラムの書き方が異なる3つの機能の効率(消費時間)を比較します。
badloops.php
require_once('Benchmark/Iterate.php')
define('MAX_RUN',100);
$data = array(1, 2, 3, 4, 5);
doBenchmark('v1', $data);
doBenchmark('v3', $data);
関数 doBenchmark($functionName = null, $arr = null);リセット($arr);
$benchmark = new Benchmark->run(MAX_RUN, $functionName, $arr);
echo '
'; printf("%s は %d 回実行され、平均実行時間は %.5f ミリ秒",$functionName,$result['iterations'],$result['mean'] * 1000); = null) {
// 非常に非効率なループ
for ($i =0; $i {
echo ' '
}
}
//最高の効率
" <!--", implode(" --> ";
}
?>
プログラムの出力結果はおそらく次のようになります:
v1 ran 100回、平均実行時間0.18400ミリ秒
v2が100回、平均実行時間0.15500ミリ秒
v3が100回、平均実行時間0.09100ミリ秒
関数の実行時間が短くなり、効率が上がっていることがわかります。
関数 v1 には明らかなエラーがあります。各ループの時間を計算するには sizeof() 関数を呼び出す必要があります。関数 v2 は、$myArray 配列の要素数をループの外で $max 変数に格納するため、各ループで配列の要素数を計算する必要がなくなり、効率が向上します。 Function v3 は最も効率的で、既存の関数を使用してループを回避します。
この例は、比較的効率的なコードがどのようなものであるかを感覚的に理解できるようにするだけです。実際の開発では、非効率なコードをダラダラと大量に書いてしまう人も多いと思います。簡潔で効率的なコードを書くには、練習に時間がかかると思います :-) しかし、これは別のトピックなので飛ばしましょう。
データベースアプリケーションは基本的にどのPHPプログラムでも使われますが、実際に開発してみると、システム全体の効率に最も大きな影響を与えるのはデータベース部分であることが分かりました。データベースの最適化とデータ クエリ ステートメントの最適化については、紙面の都合上、ここでは詳しく説明しません。読者は「MySQL クエリ最適化技術講座」を参照してください