blue_cowdawg has asked for the wisdom of the Perl Monks concerning the following question:

Fellow Monks,

I have been toying around for the first time with h2xs to create some Perl modules that use C code in their inner workings. In particular I am experimenting with using the MySQL C API to possibly speed up queries to a MySQL database.

In my currently purely Perl CGI environment I have the notion of a dataObj that serves as a base to other modules that represent data types that are stored as table records in my database. As a result dataObj::contactInfo @ISA(dataObj) and inherits such methods as connect2db, insert, delete, query2struct and others.

I would like to set up the same sort of inheritance in XS but it doesn't seem to work. The subordinate objects do not seem to see the parent objectrs. Am I all wet here? Am I missing something? Is there a way to make this work?


Peter L. Berghold -- Unix Professional
Peter at Berghold dot Net
   Dog trainer, dog agility exhibitor, brewer of fine Belgian style ales. Happiness is a warm, tired, contented dog curled up at your side and a good Belgian ale in your chalice.

Replies are listed 'Best First'.
Re: Inheritance in XS modules?
by Elian (Parson) on Sep 09, 2003 at 20:48 UTC
    XS code isn't special here--the first parameter to a method done in XS will be the object, just as with pure perl methods, and perl looks at the inheritance hierarchy the same, since it doesn't care how the methods are implemented as long as @ISA (or use base) has the tree set up right. So...

    What's your inheritance tree look like, how are you setting it up, what do the methods see, and what do you think they should see?

Re: Inheritance in XS modules?
by mpeppler (Vicar) on Sep 09, 2003 at 20:59 UTC
    I suspect that you are trying to optimize the wrong end of the problem. My experience in writing database apps in perl has been that the time spent in the database executing the queries, and fetching the data far outweigh the CPU time of the perl subroutines.

    Michael

      Actually, I have two sets of thoughts on that matter. One is the fact that the DBI doco itself IIRC says right in it that the DBI interface is not horribly efficient.

      Second is one of the major reasons I went with an inheritance structure in the pure Perl version was so connections are made ONCE and not for every object that needs to get data from the database.

      As far as if a C API interface is going to buy me anything... the jury is still out. I have to get the C API code to work before I can benchmark it.


      Peter L. Berghold -- Unix Professional
      Peter at Berghold dot Net
         Dog trainer, dog agility exhibitor, brewer of fine Belgian style ales. Happiness is a warm, tired, contented dog curled up at your side and a good Belgian ale in your chalice.
        One is the fact that the DBI doco itself IIRC says right in it that the DBI interface is not horribly efficient.

        Actually the DBI documentation says the complete opposite. From the FAQ "How fast is the DBI?":

        ... DBI and DBD::Oracle overheads are small compared with Perl language overheads (and probably database overheads).

        This matches my experience. If DBI isn't fast enough your problem is almost certainly IO, hardware or the choice of Perl as the implementation language. DBI was designed for speed - I doubt you'll see much improvement without moving most of your application onto the XS side.

        If you've not read it already I'd give Tim's DBI Advanced Talk a look over. It has lots of relevant tips on getting the most from DBI.

        My tests with DBD::Sybase vs. Sybase::CTlib actually show that DBI is pretty efficient - there isn't really any difference between the two in terms of speed. You might argue that this is because Sybase::CTlib is badly written, of course... :-)

        Michael