[PHP-users 3691] Re: pg_fetch_rowと配列の効率的な使い方
KAWAI,Takanori
php-users@php.gr.jp
Tue, 20 Nov 2001 12:10:26 +0900
川合孝典です。
#後ろにスクリプトがつながっているので、長文になっております。
----- Original Message -----
From: "Osamu Shigematsu" <shige@ravi.ne.jp>
To: <php-users@php.gr.jp>
Sent: Monday, November 19, 2001 5:52 PM
Subject: [PHP-users 3667] Re: pg_fetch_rowと配列の効率的な使い方
> 重松です。
(中略)
> 今は PEAR じゃないでしょうか。ただ、私は使ってないので。
そうでしたか。
PHPLIBとかPEARのDBクラスとかあって、どれを使った方がいいのか
ちょっとわからなかったもので。
それにPHPのclass.DBIというのも、他のメーリングリストで話題に
なっていたので。
class.DBI
http://evil.inetarena.com/php/DBI.php3
> 実行時の速度と開発/保守のやりやすさというのは、相反する場合と
> そうでない場合があると思うんです。
(以下略)
おっしゃるとおりだと思います。
ただあのコードはあくまでも単純なベンチマーク用ということで
割り切っています。通常はテンプレートを使うでしょうし、エラー処理を
やっていないなんてことないでしょうから。もちろん現実離れした形で
比較しても意味がないかなと思っていますが、あまり複雑にすると
どこが問題なのか切り分けにくいかと思っています。
で、ご指摘いただいた点に修正を加え、実行したところ若干改善した
もののほぼ同じような結果となりました。
またPEAR.DBとclass.DBIでも試してみました。
おかしなことしているといけないので、スクリプトも一緒に掲示させて
いただきます。
[結果]
取得レコード 1 10 20 30 40 50 100
---------------------------------------------------------------------
>>PHP
総平均 58.37 45.96 37.20 31.59 27.97 24.99 15.91
一回の時間(ms) 17.13 21.76 26.88 31.66 35.75 40.01 62.84
---------------------------------------------------------------------
>>Perl
総平均 42.72 38.62 34.33 31.98 29.72 26.88 19.76
一回の時間(ms) 23.41 25.90 29.13 31.27 33.65 37.21 50.60
---------------------------------------------------------------------
ご参考:
>>PHP
class.DBI (50レコード) : 17.96 Requests / 55.67 ms
PEAR.DB (50レコード) : 9.38 Requests / 106.60 ms
[利用スクリプト:PHP(pg)]
<HTML>
<HEAD>
<TITLE>TEST</TITLE>
</HEAD>
<BODY>
<?php
$conn=pg_pConnect("host=lins dbname=test user=scott password=tiger");
$result = pg_Exec($conn,
"SELECT * FROM TBL_TEST2 WHERE no >= 5000 ORDER BY no LIMIT $limit OFFSET
100");
$sRes = '';
while(@$row = pg_Fetch_Row ($result, $i++)){
for($k=0;$k<20;++$k) { $sRes .= $row[$k];}
$sRes .= '<BR>';
}
echo $sRes;
?>
</BODY>
</HTML>
<?php
pg_Close($conn);
?>
[class.DBI]
<HTML>
<HEAD>
<TITLE>TEST</TITLE>
</HEAD>
<BODY>
<?php
require_once('class.DBI');
$dbh = new DBI('pdbi:Pg:host=lins dbname=test',
'scott', 'tiger');
$sth = $dbh->prepare(
'SELECT * FROM TBL_TEST2 WHERE no >= 5000 ORDER BY no LIMIT 50 OFFSET 100');
$sth->execute();
while(@$row = $sth->fetchrow_array()) {
for($k=0;$k<20;++$k) $sRes .= $row[$k];
$sRes .= '<BR>';
}
$sth->finish();
echo $sRes;
?>
</BODY>
</HTML>
[PEAR.DB]
<HTML>
<HEAD>
<TITLE>TEST</TITLE>
</HEAD>
<BODY>
<?php
require_once('DB.php');
$db = DB::connect('pgsql://scott:tiger@lins/test', true );
$res = $db->query(
'SELECT * FROM TBL_TEST2 WHERE no >= 5000 ORDER BY no LIMIT 50 OFFSET 100');
$sRes ='';
while($row = $res->fetchrow(DB_FETCHMODE_ORDERED)) {
for($k=0;$k<20;++$k) $sRes .= $row[$k];
$sRes .= '<BR>';
}
echo $sRes;
$db->disconnect();
?>
</BODY>
</HTML>
なお環境その他は昨日と変わっておりませんので以下のURLをご覧ください。
http://www.hippo2000.net/cgi-bin/KbWiki/KbWiki.pl?
cmd=disp&page=PHP%20vs%20DBI%A5%EB%A1%BC%A5%D7%CA%D4
(2行に渡っているのでつなげていただくか、
http://www.hippo2000.net/cgi-bin/KbWiki/KbWiki.pl
から「PHP vs DBIループ編」 をご覧ください)
===================================================
川合 孝典 (Hippo2000)
DBI日本語メーリングリスト管理人、Kansai.pm所属
kwitknr@cpan.org GCD00051@nifty.ne.jp
http://member.nifty.ne.jp/hippo2000
http://www.hippo2000.net/
===================================================