Open Source Web Development Tutorials - Dev Shed
ベンチマークツールでファイルとデータベースを比較
(2009/01/29公開)
圧縮ファイル・データを読み出す&書き込む
Timerクラスを使って、いろいろなスクリプトの性能を大ざっぱに評価するこの連載を終えるにあたり、最後の例を、まったく新しいファイル処理クラスの定義に基づいて作ってみましょう。テキストファイルを使って、圧縮データの読み出しと書き込みを行うことができるクラスです。
このファイル処理クラスは、基本的に、以下のように定義します。
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 $contents;
}
// write compressed data to file
public function writeFile(){
$data='';
if(!$fp=fopen($this->dataFile,'a+')){
throw new Exception('Error opening data file!');
}
foreach($this->data as $line){
$data.=$line."n";
}
fwrite($fp,gzencode($data,9));
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クラスは、これまでの実践例で使用したクラスとほとんど同じに見えます。しかし、一番大きな違いは、対応する入力データをファイルに格納する前に圧縮する点です。このため、最終的に、その内容の読み出しに要する時間が減少するはずです。
ここで、「最終的に」という言葉を使いました。というのも、現実は違っているからです。実は、非圧縮データを使う前の例と比較して、今回の例では大幅な改善は見られません。
上の概念を理解するため、以下のベンチマークスクリプトを見てください。
// example using 'FileProcessor' class (reads compressed data from file)
try{
// instantiate 'Timer' object
$timer=new Timer();
// instantiate 'FileProcessor' object
$fileProc=new FileProcessor('data_file.txt');
// start timer
$timer->start();
// read compressed data from file
$fileProc->readFile();
// stop timer
$elapsedTime=$timer->stop();
echo 'reading compressed data to file took '. $elapsedTime.' seconds';
}
catch(Exception $e){
echo $e->getMessage();
exit();
}
/*
displays the following:
Reading compressed data from file took 0.00063 seconds
*/
この例に関する限り、対応するデータファイルから圧縮データを読み出すプロセスで、性能が大きく改善されることはありませんでした(このスクリプトはローカルサーバーでのみテストされています)。
しかし、リモートサーバーを使い、実際の条件下で同様のファイル処理アプリケーションをテストしたら、圧縮データで作業するほうが性能を向上するはずです。結果は、テスト環境に大きく左右されます。当然、この点は大いに実験の余地があります。ですから、ぜひ、ベンチマークスクリプトを使って、実環境で自分のアプリケーションをテストしてみましょう。
最後に
今回はこれでおしまいです。全3回のこの連載では、時間測定を目的とした関数/クラスを展開する基盤として、microtime()組み込みPHP関数を使用する簡単なベンチマークスクリプトの作り方を学習しました。
明らかに、特定のPHPアプリケーションの性能評価は多くの要素に左右されます。この連載では分かりやすい例に絞って、元来PHPに備わっている素晴らしい時間測定の利用方法を解説したにすぎません。
では、別のPHPチュートリアルをお楽しみに!
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








