SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

コードの最適化に役立つPHPスクリプトのベンチマーク

Benchmarkパッケージを使ったベンチマーク出力とグラフ表示

  • X ポスト
  • このエントリーをはてなブックマークに追加

単純ながらも強力なベンチマークテクニックを使ってPHPアプリケーションを最適化する方法を覚えましょう。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 どのようなソフトウェアも、市場に出て洗練された製品になるまでには、最適化のプロセスを経る必要があります。メモリリークを見つけて製品のパフォーマンスを向上させるのは、多くの作業時間と人的資源を必要とする難しい作業です。最適化という課題においてベンチマークは重要です。個別のコード部品と全体のコードの両方を検証できますし、ベンチマークのレポートや統計データから、実際の実行時のパラメータやパフォーマンスを推測できるからです。

 PHPではBenchmarkパッケージを使用できます。これはPHPスクリプトや実行する関数のベンチマークに使われるPEARパッケージです。リリースされている最新版は1.2.7(安定版)です。パッケージのダウンロード後、次のようにしてインストールすることができます。

>> pear install Benchmark-1.2.7

 Benchmarkパッケージで何ができるかを示すため、フィボナッチ数列の生成という古典的な問題を例に、2つの解法(反復と再帰)を紹介します。この問題を詳しく説明すると本稿の目的から外れてしまいますが、問題自体は非常に一般的なものです。フィボナッチ数列の生成についてよくわからない場合や、もう一度フィボナッチ数列をよく理解したい場合は、こちらを参照してください。

PEAR Benchmarkのクラスツリー

 このパッケージには、ベンチマーク測定に使用できるいくつかのクラスが含まれています。

  • Benchmark_Timer
  • Benchmark_Iterate
  • Benchmark_Profiler

 本稿ではこの各クラスについて取り上げ、よく使われるメソッドと、具体的な使用例を紹介します。

Benchmark_Timerクラス

 Benchmark_Timerクラスには、正確なタイミング情報を返すメソッド一式が含まれています。このクラスで最もよく使われるメソッドのプロトタイプを次に示します。

  • void start() ― 開始マーカーを設定します。
  • void stop() ― 停止マーカーを設定します。
  • void setMarker(string $name) ― マーカーを設定します。$nameパラメータは、設定するマーカーの名前を示しています。
  • void display([boolean $showTotal = FALSE], [string $format = 'auto']) ― フォーマットされた測定結果を返します。$showTotalパラメータをtrueに設定すると、詳しい測定結果が出力されます。$formatパラメータには、出力フォーマットを指定します。デフォルトはautoで、他にはplain、またはhtmlがあります。autoが指定された場合は、PEARによってplainまたはhtmlが選択されます(ほとんどの場合はplainが選択されます)。
  • array getProfiling() ― 測定結果を連想配列で返します。$profiling[x]['name']は、マーカーxの名前を示します。$profiling[x]['time']は、マーカーxのタイムスタンプを示します。$profiling[x]['diff']は、マーカーx-1からマーカーxまでの実行時間を示します。また、$profiling[x]['total']は、マーカーxまでの実行時間の合計です。

フィボナッチ数列のベンチマーク(反復の場合)

 この例では、フィボナッチ数列を反復で求める処理にBenchmark_Timerクラスを適用し、フォーマットされた測定結果を返します。

<?php
   
require_once 'Benchmark/Timer.php';
   
function fibonacci(){
   //create an instance of Benchmark_Timer class
   $timer = new Benchmark_Timer();
         
   //Set "Start" marker
   $timer->start();
         
   $a=0;$b=1;
         
   for ($i = 0; $i < 10; $i++) {
      $s=$a+$b;
      
      //Set the markers fibonacci
      $timer->setMarker('fibonacci'.$i);
             
      $a=$b;
      $b=$s;
   } 
         
   //Set "Stop" marker
   $timer->stop();
         
   //Returns formatted informations
   $timer->display(); 
         
   echo '<pre>';
         
   //Get the profiler info as an associative array
   $profiling = $timer->getProfiling(); 
         
   //Display all the information: name, 
   // time, difference between two  
   //consecutive markers and total time
   print_r($profiling[1]);
   print_r($profiling[2]);
   print_r($profiling[3]);
   echo '</pre>';
}
   
fibonacci();
  
?>

 このコードでは、開始マーカーを設定した後で、フィボナッチ数列の最初の数値から10個を生成するループを開始します。値を1つ生成するたびに、「fibonacci+ループカウンタ値」という名前のマーカー(fibonacci1、fibonacci2など)を設定します。

 リスト1も同様のコードですが、こちらはフィボナッチ数列を再帰で求める処理についてのベンチマークテストです。

リスト1 フィボナッチ数列のベンチマーク(再帰の場合)(Fibonacci_recursive_timer.php)
<?php

require_once 'Benchmark/Timer.php';

//create an instance of the Benchmark_Timer class 
$timer = new Benchmark_Timer();

//Set "Start" marker
$timer->start();

function fibonacci($n){
       if(($n>=0)and($n<2))
                {return 1;}
                  else 
                   {return fibonacci($n-1)+fibonacci($n-2);}
}

for ($i = 0; $i < 10; $i++) {
     //Set the markers fibonacci
     $timer->setMarker('fibonacci'.$i);
     fibonacci($i);    
}   

//Set "Stop" marker
$timer->stop();

//Returns formatted informations
$timer->display(); 

echo '<pre>';

//Get the profiler info as an associative array
$profiling = $timer->getProfiling(); 

//Display all the information: name, time, 
//difference between two consecutives markers and 
//total time
print_r($profiling[1]);
print_r($profiling[2]);
print_r($profiling[3]);
echo '</pre>';

?>

次のページ
ベンチマーク結果の出力

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Octavia Andreea Anghel(Octavia Andreea Anghel)

経験豊富なPHP開発者。現在は、国内外のソフトウェア開発コンテストに参加するプログラミングチームの主任トレーナーを務める。国レベルの教育プロジェクト開発のコンサルティングも担当している。共著書に『XML technologies?XML in Java』があり、XML部分の執筆を担当。PHPやXML...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2784 2008/07/31 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング