[Catalyst] dbic models and startup time server
Brandon Black
blblack at gmail.com
Tue Aug 22 17:29:19 CEST 2006
On 8/22/06, Josef Chladek <j.chladek at wirtschaftsblatt.at> wrote:
> what we notice: in Catalyst/Model/DBIC/Schema.pm the time of the
> require of the schema
>
> $schema_class->require
>
> is fast for the first loaded schemas (0.05s) but takes about 0.6s for
> the last schemas. also time to connect
>
> $self->schema->connection(@{$self->{connect_info}});
>
> begins with 0.05s and goes up to 0.6s, so overall the startup process
> takes now about 15s for 19 models/schemas.
Is this timed under mod_perl, or standalone? If you're timing it under
mod_perl, its probably just getting progressively slower as all of the
copies get started up. If not, can the increasing times be explained by
increasing schema complexity? At "$schema_class->require" is when
load_classes runs and you should be mostly seeing
Class::C3/Alg::C3/load_components/etc initialization delays (which is what
I'm still working on reducing, but it may be a little while). I'm surprised
that ->connection takes any significant time in perl, are you sure this
isn't a case of the DB server responding slower and slower?
If you want to find a spot in one of the public modules to improve
performance, you should profile your models under Devel::Profile to point
out the hotspots. Make a script which "uses" all of your model classes,
then sets up any config on them that was coming from YAML or other such
sources (connect_info and/or schema class), then calls ->new on each of them
and exits. Run it w/ "perl -D:Profile testscript.pl", then look at the top
entries in the generated prof.out. This example is typical of what I
usually see percentage-wise:
%Time Sec. #calls sec/call F name
27.67 1.2513 259 0.004831 Algorithm::C3::merge
24.69 1.1163 161 0.006933
Class::C3::_calculate_method_dispatch_table
4.52 0.2042 161 0.001269
Class::C3::_remove_method_dispatch_table
3.64 0.1646 161 0.001023
Class::C3::_apply_method_dispatch_table
2.97 0.1343 98 0.001370
DBIx::Class::Componentised::ensure_class_loaded
2.75 0.1243 5837 0.000021
<anon>:...e_perl/5.8.8/Class/C3.pm:146
1.93 0.0871 482 0.000181
DBIx::Class::AccessorGroup::_mk_group_accessors
1.38 0.0626 183 0.000342 DBIx::Class::Schema::register_source
It was based on this kind of feedback that I focused on Alg::C3 first (its
time is down substantially from what it used to be, and it might not be
possible to make it significantly faster without rewriting it in XS).
Obviously the *_method_dispatch_table methods in Class::C3 are another
target that needs looking at (and again, there's some work in progress on
this, which involves XS code, but it might not be ready until sometime after
YAPC::EU at the least).
-- Brandon
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.rawmode.org/pipermail/catalyst/attachments/20060822/d740c730/attachment.htm
More information about the Catalyst
mailing list