TEDIA会員に登録したメールアドレスとパスワードを入力してください

メールアドレス:

     パスワード:


パスワードを忘れた方はパスワードの確認を行ってください。

TEDIA会員へのご登録がお済みで無い方はこちらで登録ができます


>> テクノロジーポータル TEDIA トップページへ戻る <<

Think IT Software Developer's Think IT Find-IT 失敗しないソフト選び Find-IT TEDIA テクノロジーポータル TEDIA インストールマニアックス2008 インストールマニアックス2008

TEDIA SponsorsOpen Source Web Development Tutorials - Dev Shed

ベンチマークツールでファイルとデータベースを比較
(2009/01/29公開)

フラットなテキストファイルからデータを読み出す

 前ページで説明したとおり、次のベンチマーク例では、通常のテキストファイルを使って同じ10行を読み出します。最初に、テキスト・ファイルからレコードをフェッチするクラスを定義しなくてはなりません。そこで、以下のようなコードを書きました。


// define 'FileProcessor' class
class FileProcessor{
private $data=array();
private $dataFile;
public function __construct($dataFile){
if(!file_exists($dataFile)){
throw new Exception('Invalid data file!');
}
$this->dataFile=$dataFile;
}
// read data from file
public function readFile(){
if(!$contents=file_get_contents($this->dataFile)){
throw new Exception('Error reading data file!');
}
return nl2br($contents);
}
// write data to file
public function writeFile(){
if(!$fp=fopen($this->dataFile,'a+')){
throw new Exception('Error opening data file!');
}
foreach($this->data as $line){
if(!fwrite($fp,$line."n")){
throw new Exception('Error writing data file!');
}
}
fclose($fp);
}
// add data to $data array
public function addData($data){
if(!is_string($data)){
throw new Exception('Data must be a string!');
}
$this->data[]=$data;
}
}



 上述したFileProcessorクラスのコードは、実際、とても簡単に理解できます。要するに、このクラスは、格納するために、フラットなテキストファイルを使ってデータを読み出して書き込むだけです。もちろん、メソッドの大部分は大幅に改善できる余地がありますが、今のところ、このベンチマーク例には十分です。

 さて、ファイル処理クラスをお見せしたところで、今度は2つのショートスクリプトです。1番目のスクリプトは、10の新規レコードをサンプルテキストファイルに挿入します。2番目のスクリプトは、このデータを読み出して、内容をブラウザ上に表示します。

 対応するコード例は、以下のとおりです。


// example using 'FileProcessor' class (writes data to file)
try{
// instantiate 'Timer' class
$timer=new Timer();
// instantiate 'FileProcessor' object
$fileProc=new FileProcessor('data_file.txt');
// start timer
$timer->start();
$fileProc->addData('ID: 1 Name: user1 Email: user1@domain.com');
$fileProc->addData('ID: 2 Name: user2 Email: user2@domain.com');
$fileProc->addData('ID: 3 Name: user3 Email: user3@domain.com');
$fileProc->addData('ID: 4 Name: user4 Email: user4@domain.com');
$fileProc->addData('ID: 5 Name: user5 Email: user5@domain.com');
$fileProc->addData('ID: 6 Name: user6 Email: user6@domain.com');
$fileProc->addData('ID: 7 Name: user7 Email: user7@domain.com');
$fileProc->addData('ID: 8 Name: user8 Email: user8@domain.com');
$fileProc->addData('ID: 9 Name: user9 Email: user9@domain.com');
$fileProc->addData('ID: 10 Name: user10 Email: user10@domain.com');
// write data to file
$fileProc->writeFile();
// stop timer
$elapsedTime=$timer->stop();
echo 'Writing data to file took '.$elapsedTime.' seconds';
 
/*
displays the following
Writing data to file took 0.00124 seconds
*/
 
}
catch(Exception $e){
echo $e->getMessage();
exit();

 
// example using 'FileProcessor' class (reads data from file)
try{
// instantiate 'Timer' object
$timer=new Timer();
// instantiate 'FileProcessor' object
$fileProc=new FileProcessor('data_file.txt');
// start timer
$timer->start();
// read data from file
$data=$fileProc->readFile();
// stop timer
$elapsedTime=$timer->stop();
echo 'File data is listed below: <br />'.$data;
echo 'Reading data from file took '.$elapsedTime.' seconds';
}
catch(Exception $e){
echo $e->getMessage();
exit();
}

/* displays the following:

File data is listed below:
ID: 1 Name: user1 Email: user1@domain.com
ID: 2 Name: user2 Email: user2@domain.com
ID: 3 Name: user3 Email: user3@domain.com
ID: 4 Name: user4 Email: user4@domain.com
ID: 5 Name: user5 Email: user5@domain.com
ID: 6 Name: user6 Email: user6@domain.com
ID: 7 Name: user7 Email: user7@domain.com
ID: 8 Name: user8 Email: user8@domain.com
ID: 9 Name: user9 Email: user9@domain.com
ID: 10 Name: user10 Email: user10@domain.com
Reading data from file took 0.00061 seconds
*/



 1番目の例は、まったく同一の10のレコードをサンプルの「data_file.text」ファイルに投入し、このプロセスの所要時間を表示して実行を終了します。しかし、2番目の例に注目してください。もっと面白いですよ。上の実践例では、リバースプロセスを実行しているのです。すなわち、上述のテキストファイルからデータを読み出して、スクリーン上にエコー(伝達)しています。

 データベーステーブルから行をフェッチした場合、そして各テキストファイルからデータを読み出した場合、表示されたそれぞれのベンチマーク値を比較すると、後者のほうが大幅に短時間で実行されたことが明らかです。

 実践例はすべてローカル・サーバーでテストしましたが、使用したTimerクラスは、すべての実践例で、いろいろなPHPスクリプトの性能評価にとても役立ちました。PHPでスクリプトをベンチマークするのはとても簡単だと言いましたが、そのとおりだったでしょう?

 さて、以上で、PHPを使った簡単な時間測定スクリプトの作り方が理解できたと思います。しかし、まだ旅はまだ終わりではありません。次ページで別の例を挙げて、同じくテキストファイル経由でデータの読み出しと書き込みを行う別のサンプルクラスの性能を評価してみます。

 最後の実践例は、どのように展開するのか…答えを知りたい人は、次ページへのリンクをクリックして、進んでください。


前のページ     1    2    3    4    次のページ

Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.