[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/
===================================================