Hi eyepopslikeamosquito,
Unfortunately, method calling in Perl is expensive. The following change to Organism.pm will run two times faster simply by inlining is_alive.
Before:
sub is_alive {
my $self = shift;
return 0 + exists $self->{Cells}->{ join ':', @_ };
}
# Return the list of dead cells surrounding a cell
sub get_dead_cells {
my ( $self, $x, $y ) = @_;
( (join ':', $x - 1, $y - 1) x !$self->is_alive($x - 1, $y - 1),
(join ':', $x - 1, $y ) x !$self->is_alive($x - 1, $y ),
(join ':', $x - 1, $y + 1) x !$self->is_alive($x - 1, $y + 1),
(join ':', $x , $y - 1) x !$self->is_alive($x , $y - 1),
(join ':', $x , $y + 1) x !$self->is_alive($x , $y + 1),
(join ':', $x + 1, $y - 1) x !$self->is_alive($x + 1, $y - 1),
(join ':', $x + 1, $y ) x !$self->is_alive($x + 1, $y ),
(join ':', $x + 1, $y + 1) x !$self->is_alive($x + 1, $y + 1) );
}
sub get_num_live {
my ( $self, $x, $y ) = @_;
$self->is_alive( $x - 1, $y - 1 )
+ $self->is_alive( $x - 1, $y )
+ $self->is_alive( $x - 1, $y + 1 )
+ $self->is_alive( $x , $y - 1 )
+ $self->is_alive( $x , $y + 1 )
+ $self->is_alive( $x + 1, $y - 1 )
+ $self->is_alive( $x + 1, $y )
+ $self->is_alive( $x + 1, $y + 1 );
}
After:
# Return the list of dead cells surrounding a cell
sub get_dead_cells {
my ( $cells, $x0, $y0 ) = ( shift->{Cells}, @_ );
my ( $x1, $x2, $y1, $y2 ) = ( $x0 - 1, $x0 + 1, $y0 - 1, $y0 + 1 );
( ( "$x1:$y1" ) x !( 0 + exists $cells->{ "$x1:$y1" } ),
( "$x1:$y0" ) x !( 0 + exists $cells->{ "$x1:$y0" } ),
( "$x1:$y2" ) x !( 0 + exists $cells->{ "$x1:$y2" } ),
( "$x0:$y1" ) x !( 0 + exists $cells->{ "$x0:$y1" } ),
( "$x0:$y2" ) x !( 0 + exists $cells->{ "$x0:$y2" } ),
( "$x2:$y1" ) x !( 0 + exists $cells->{ "$x2:$y1" } ),
( "$x2:$y0" ) x !( 0 + exists $cells->{ "$x2:$y0" } ),
( "$x2:$y2" ) x !( 0 + exists $cells->{ "$x2:$y2" } ) );
}
sub get_num_live {
my ( $cells, $x0, $y0 ) = ( shift->{Cells}, @_ );
my ( $x1, $x2, $y1, $y2 ) = ( $x0 - 1, $x0 + 1, $y0 - 1, $y0 + 1 );
( 0 + exists $cells->{ "$x1:$y1" } )
+ ( 0 + exists $cells->{ "$x1:$y0" } )
+ ( 0 + exists $cells->{ "$x1:$y2" } )
+ ( 0 + exists $cells->{ "$x0:$y1" } )
+ ( 0 + exists $cells->{ "$x0:$y2" } )
+ ( 0 + exists $cells->{ "$x2:$y1" } )
+ ( 0 + exists $cells->{ "$x2:$y0" } )
+ ( 0 + exists $cells->{ "$x2:$y2" } );
}
Regards, Mario
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.