[sf-perl] making perl compile phase faster

George Hartzell hartzell at alerce.com
Sat Apr 30 16:49:07 PDT 2011


Chris Weyl writes:
 > On Sat, Apr 30, 2011 at 11:29 AM, George Hartzell <hartzell at alerce.com>wrote:
 > 
 > > Chris Weyl writes:
 > >  > Hm.  Do you actually need these modules loaded?  (I'm guessing not)  One
 > > way
 > >  > I've dealt with things like this using, e.g., MooseX::App::Cmd and
 > > having a
 > >  > role wrap execute() in each of the command classes, that then calls
 > >  > Class::MOP::load_class() against any modules the command needs to do its
 > >  > thing if the command is told to run.  (MX::App::Cmd is just what I tend
 > > to
 > >  > use; the same methodology would work elsewhere.)  This doesn't do any
 > >  > pre-compiling, but helps simply by cutting down to loading only what's
 > >  > needed.
 > >  > [...]
 > >
 > > Hi Chris,
 > >
 > > Can you post an example of this?  Or a bit more complete sketch?
 > >
 > > I have several a MooseX::App::Cmd based classes that could probably
 > > benefit from this...
 > >
 > 
 > Sure -- imagine something like this:
 > 
 > package MyApp::CommandRole::Lazy;
 > 
 > use Moose::Role;
 > use namespace::autoclean;
 > 
 > requires '_lazy_classes';
 > requires 'execute';
 > 
 > before execute => sub { Class::MOP::load_class($_) for $_[0]->_lazy_classes
 > };
 > 
 > ...then over in a command class:
 > 
 > package MyApp::Command::something;
 > 
 > use Moose;
 > use namespace::autoclean;
 > extends 'MooseX::App::Cmd::Command';
 > with 'MyApp::CommandRole::Lazy';
 > 
 > sub _lazy_classes { qw/ Big::DBIC::Schema OtherLargeClass ... / }
 > 
 > sub execute { ... }
 > 
 > etc.  This way everything MX::App::Cmd needs for introspection loads
 > properly every time the app/tool is run, but only when a given command class
 > is actually execute()'ed do the big packages get loaded.
 > 
 > The same method works with extending MooseX::App::Cmd::Command for a custom
 > base class for your CLI tools.  The advantage to the role here is that you
 > don't need to worry about making sure the lazy classes are loaded by
 > anything execute() does in your command classes: including the role and
 > providing the required methods is sufficient.
 > 
 >                                     -Chris

Hmmm.  Took one of my apps from about 5 seconds to display the usage
methods down to 1.5 seconds.  That's really a perceptible difference.
Cool....

g.


More information about the SanFrancisco-pm mailing list