Re: Moose speed and schedule

[email protected] (Stevan Little)
Newsgroups perl.moose
Message-ID <[email protected]>
Jonathan,

I tested your benchmark script against the (in progress) immutable  
Moose branch. Here is what I got:

First, your benchmark:

Benchmark: timing 1000 iterations of ClassAccessorPage, MoosePage...
ClassAccessorPage:  0 wallclock secs ( 0.02 usr +  0.00 sys =  0.02  
CPU) @ 50000.00/s (n=1000)
            (warning: too few iterations for a reliable count)
MoosePage: 22 wallclock secs (18.41 usr +  0.33 sys = 18.74 CPU) @  
53.36/s (n=1000)


Then my benchmark before making the class immutable (I have a 1.5gHz  
G4 powerbook with 1.5g of RAM):

Benchmark: timing 1000 iterations of ClassAccessorPage, MoosePage...
ClassAccessorPage:  0 wallclock secs ( 0.01 usr +  0.00 sys =  0.01  
CPU) @ 100000.00/s (n=1000)
             (warning: too few iterations for a reliable count)
MoosePage: 14 wallclock secs ( 9.78 usr +  0.16 sys =  9.94 CPU) @  
100.60/s (n=1000)

Now, with the class made immutable:

Benchmark: timing 1000 iterations of ClassAccessorPage, MoosePage...
ClassAccessorPage:  0 wallclock secs ( 0.01 usr +  0.00 sys =  0.01  
CPU) @ 100000.00/s (n=1000)
             (warning: too few iterations for a reliable count)
MoosePage:  1 wallclock secs ( 0.93 usr +  0.01 sys =  0.94 CPU) @  
1063.83/s (n=1000)

Now, Class::Accessor is still *much* faster, but it does not check  
the fields in the hash passed to new, it just copies them into the  
instance. Moose does not do this, it only allows legitimate slots to  
be added to the instance. In fact, here is the constructor it  
generates (formatted to make it readable).

sub {
     my $class = shift;
     my %params = (scalar @_ == 1) ? %{$_[0]} : @_;
     my $instance = bless {} => $class;
     ## title
     (exists $params{'title'}) && do {
         my $val = $params{'title'};
         $instance->{'title'} = $val;
     };
     return $instance;
}

As you can see, there are still some things which can be cleaned up  
for minimal cases like this, like removing the lexical usage in the  
slot assignment. I am working on this now.

- Stevan


On Nov 12, 2006, at 2:51 PM, Jonathan Swartz wrote:

>    #!/usr/bin/perl
>    use Benchmark;
>    use strict;
>    use warnings;
>
>    { package MoosePage;
>      use Moose;
>
>      has 'title' => (is => 'rw');
>    }
>
>    { package ClassAccessorPage;
>      use strict;
>      use warnings;
>      use base qw(Class::Accessor);
>
>      __PACKAGE__->mk_accessors(qw(title));
>    }
>
>    printf "Using Moose version %s, Class::MOP version %s,  
> Class::Accessor version %s\n", $Moose::VERSION,  
> $Class::MOP::VERSION, $Class::Accessor::VERSION;
>
>    timethese(1000, {
>        'MoosePage' => sub { my $page = new MoosePage(title =>  
> 'article') },
>        'ClassAccessorPage' => sub { my $page = new ClassAccessorPage 
> ({title => 'article'}) },
>              });
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.