in reply to Re: best way to inline code? (i.e. macro)
in thread best way to inline code? (i.e. macro)

Um, string-y eval under mod_perl can be a really, really bad idea, given that it can start a whole new interpreter instance. I'd suggest testing this thoroughly before attempting it in any production server.

  • Comment on Re^2: best way to inline code? (i.e. macro)

Replies are listed 'Best First'.
Re^3: best way to inline code? (i.e. macro)
by perrin (Chancellor) on Oct 17, 2005 at 21:52 UTC
    You already have an interpreter instance if you are running code under mod_perl. String eval under mod_perl does have the same downsides that it does in any other perl code though.
      Nice to see a familiar mod_perl'er on the PM site :) (Hi Perrin).

      FWIW, the code in question is a DB_Connect sub that calls Apache::DBI's DBI->connect. So I've got lots of select/udpate subroutines, and they each call the DB_Connect sub at the beginning to get a database handle. I'd consider just making the $dbh a global var, but then I'd lose the implicit Apache::DBI ping/reconnect.
      sub DB_connect { return DBI->connect( $Const::DB_Name, $Const::DB_User, $Const::DB_Pass, { PrintError => 1, RaiseError => 1, AutoCommit => 1 } ) || die "DATABASE CONNECTION ERROR: " . $DBI::errstr . "\n"; }
      Anyways, running DProf shows that the frequent DB_Connect calls are sucking extra CPU cycles, so I thought (if there was an easy way to try it) I'd just inline my DBI->connect subroutine. I know, you're saying "that's not the problem" or "that's a fishing expedition", etc. Very possible... and that's why I was hoping there was a very easy way to test inlining the sub.

      I'm not crazy about the notion of using eval '', particularly since it looks like from the first suggestion given that I have to eval all of my calling subs, which is alot. Really, ideally, I think even a C-style preparser #define would do the trick.... if one existed in Perl...

      MFN
        I know, you're saying "that's not the problem"

        You read my mind! Try replacing that connect() with a connect_cached().

        -sam

        I doubt it's worth it. You might try sorting your profile by wall time to see how it changes things. However, if you want to pursue it, do a search on this site for "macro" and I think you'll find lots of stuff. The simplest answer is probably to just the cpp on your perl code.