[PHP-users 30864] Re: SQLiteDatabasekクラスについて

komura komura @ ma9.seikyou.ne.jp
2006年 12月 3日 (日) 01:33:32 JST


komura です。

On Sat, 2 Dec 2006 17:44:44 +0900
"yusuke ito" <ito.ysk @ gmail.com> wrote:

> 実はSQLiteDatabaseクラスはsqlite_*な関数を使って実現しているんだよ!
> という証拠が見つかれば迷わずsqlite_*を使うのですが
> (その方がパフォーマンスがよいでしょうから)
> PHP-5.2のソースツリーをgrepしても「SQLiteDatabase」という文字列を
> 見つけられずその辺どうやって実装しているのか、わかりませんでした。
> (ベンチマークとれば?と言われるとアレですが、ソースから根拠を得たい)

ソースコードを簡単に見てみただけですが、結論としては、パフォーマンス
には、大きな差はないと思いますので、後で読みやすいかという方を重視した
方が良いと思います。
ただし、オブジェクト生成のコストなど、細かいところまで重視されるのでしたら、
ベンチマークを行ってどの程度の差が出るのか検証した方が良いと思います。

ext/sqlite.c を見ると、SQLiteDatabase というクラスは、sqlite_*() を使用
して実現しているというよりは、オブジェクトのメソッドに対応する関数を
呼び出し、関数内でオブジェクトとして呼び出されたかどうかによって分岐処理
を行っているようです。

実際のソースコードを確認した方が良いと思いますが、
sqlite_query( $dbhandle, $query ) も $dbobject->query( $query ) も
C のソースでは、ext/sqlite.c にある void sqlite_query( zval *object, ... )
を実行します。

例えば、
  sqlite_query( $dbhandle, $query )
と
  $dbobject->query( $query )
の違いは、オブジェクトのメソッドとして呼び出された場合の処理が実行されるか
どうかくらいです。


> 私の探し方が根本的に間違っているんでしょうか。
> SQLiteDatabaseクラスはソース中のどこでどのように定義されているのか、
> どなたか解説いただけませんでしょうか…

すでに、高木さんがメールで示しておられますが、INIT_CLASS_ENTRY を使用して
定義されています。

また、オブジェクトのメソッドと C の関数への対応については、PHP_ME_MAPPING
で定義されているようです。


以上、少しでも参考になりましたら幸いです。

-- 
komura <komura @ ma9.seikyou.ne.jp>


PHP-users メーリングリストの案内