日記
Zend_Db_TableでdescribeTableを使う場合と使わない場合のベンチマークEdit

Zend_Db_Tableで、毎回describeTableでテーブル情報を取得する場合と、class定義にあらかじめテーブル情報を記述しておいた場合の、速度比較。

サンプルテーブル定義

CREATE TABLE memo (
id int(11) NOT NULL auto_increment,
user_id int(11) NOT NULL default '0',
title varchar(255) NOT NULL default '',
rgdt datetime NOT NULL default '0000-00-00 00:00:00',
updt datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY  (id),
)

サンプルコード

$db = /* デフォルトDBアダプター */;
Zend_Db_Table::setDefaultAdapter($db);
// 標準のZend_Db_Table
class Memo extends Zend_Db_Table {}
// テーブル情報をあらかじめクラス定義で記述
class Memo2 extends Zend_Db_Table {
protected $_name = 'memo';
protected $_cols = array(
'id' => 'id',
'user_id' => 'userId',
'title' => 'title',
'rgdt' => 'rgdt',
'updt' => 'updt',
);
}
// シリアライズしてファイルに保存したテーブル情報を利用
class Memo3 extends Zend_Db_Table {
public function __construct()
{
$serializedColumns = './columns.txt';
$this->_cols = unserialize(file_get_contents($serializedColumns));
parent::__construct();
}
}
$start = microtime(true);
for ($i = 0; $i < 1000; $i ++) {
$table = new Memo();
}
$end = microtime(true);
echo 'Memo: ' . ($end - $start) . "\n";
$start = microtime(true);
for ($i = 0; $i < 1000; $i ++) {
$table = new Memo2();
}
$end = microtime(true);
echo 'Memo2: ' . ($end - $start) . "\n";
$start = microtime(true);
for ($i = 0; $i < 1000; $i ++) {
$table = new Memo3();
}
$end = microtime(true);
echo 'Memo3: ' . ($end - $start) . "\n";

結果(3回分)

Memo: 3.4024510383606
Memo2: 0.2038938999176
Memo3: 0.67136812210083
Memo: 3.6163651943207
Memo2: 0.20920920372009
Memo3: 0.87713384628296
Memo: 3.3675861358643
Memo2: 0.20081806182861
Memo3: 0.63753986358643

Published At2006-08-14 00:00Updated At2006-08-14 00:00