PHP5.1.0RC1でPDOとADODB、PEAR::DBのベンチマーク(PostgreSQL&MySQL)
PHP5.1辺りでどうやら5系に乗り換えても良さそうな雰囲気が漂っていますが、データベースに接続する機構のPDO(PHP Data Object)を試しつつADODBやPEAR::DB、ネイティブの関数とどの程度速度に差が出るのか簡単に試してみました。
結果的に当然のことながらネイティブの方がかなり速く、PDOも(PostgreSQLの結果を見る限り)良さそう。
対象となるSQLは10行の適当なデータを入れたDBからのSELECT。なるべく同じ条件下でベンチマークを取ったつもりですが、ADODBが意外と遅かったので正しいのか……?
MySQLは5.0.15でも試しましたが4.1系とほぼ同じ結果。MySQLのPDOがなぜか、「SQLSTATE[HY000] [2002] Can’t connect to local MySQL server through socket ” (111)」というエラーが出て動かず。いろいろ試したのですが原因不明。
環境:
WhiteBoxLinux4、apache2.0.54、PHP5.1.0.RC1
PHPのコンパイルオプション:
./configure --with-zlib --with-pgsql --with-xmlrpc \ --without-cgi --with-pdo-pgsql \ --with-apxs2=/usr/local/apache2/bin/apxs \ --with-mysql=/usr/local/src/mysql-4.1.15 --with-pdo-mysql
| native function | PDO | ADODB | PEAR::DB | |
|---|---|---|---|---|
| PostgreSQL8.0.3 | 0.0007 | 0.004 | 0.03 | 0.014 |
| MySQL4.1.15 | 0.0008 | ? | 0.024 | 0.011 |
pgsql_native.php:
<?php
require_once("Benchmark/Timer.php");
$timer = new Benchmark_Timer(TRUE);
$conn = pg_pconnect("dbname=funaki user=funaki");
if (!$conn) {
die("cannot connect.");
}
$result = pg_query($conn, "select * from blog");
print_r(pg_fetch_all($result));
?>
pgsql_pdo.php:
<?php
require_once("Benchmark/Timer.php");
$timer = new Benchmark_Timer(TRUE);
try {
$dbh = new PDO('pgsql:host=localhost;dbname=funaki', "funaki", "");
$sth = $dbh->prepare("select * from blog");
$sth->setFetchMode(PDO_FETCH_ASSOC);
$sth->execute();
print_r($sth->fetchAll());
} catch (PDOException $e) {
die($e->getMessage());
}
?>
pgsql_adodb.php:
<?php
require_once("Benchmark/Timer.php");
$timer = new Benchmark_Timer(TRUE);
dl('adodb.so');
require_once('adodb/adodb.inc.php');
$db = ADONewConnection('postgres');
$db->Connect("localhost", "funaki", "", "funaki");
$db->setFetchMode(ADODB_FETCH_ASSOC);
$rs =& $db->Execute('select * from blog');
print_r(adodb_getall($rs));
?>
pgsql_pear.php:
<?php
require_once("Benchmark/Timer.php");
$timer = new Benchmark_Timer(TRUE);
require_once("DB.php");
$db = DB::connect("pgsql://funaki@unix(/tmp)/funaki");
if (PEAR::isError($db)) {
die($db->getMessage());
}
$sql = "select * from blog";
$db->setFetchMode(DB_FETCHMODE_ASSOC);
print_r($db->getAll($sql));
?>
mysqliでも試してもらえると嬉しいです