Dan Sugalski wrote:
> I think perhaps a rewrite of life.pasm into perl with some
> benchmarking would be in order before making that judgement.
Following is a rough perl5 version of life.pasm.
On my system [Pentium 166; linux 2.2.18; perl 5.6.1] this takes 96 to 97
seconds; CVS parrot takes 91 to 92 seconds (without JIT)
So, thus far, we aren't doing too badly. I am sure the perl version can be
optimised, but as it stands I think it is a reasonable equivalent of what
the pasm version does.
--
Peter Gibbs
EmKel Systems
#!/usr/bin/perl
#
# life.perl
#
# Play conway's (no, not *him*. The other conway) game
# of life
#
# First the generation count
$I2 = 5000;
# Note the time (for perl, this is seconds only)
$N5 = time;
# If true, we don't print
$I12 = 1;
$S15 = " "
. " "
. " * "
. " ** "
. " * * "
. " "
. " * "
. " * "
. " * "
. " * "
. " * "
. " * "
. " "
. " "
. " ";
dump_life();
$I0 = 0;
while ($I0 < $I2) {
$I0++;
generate();
dump_life();
}
$N6 = time;
$N7 = $N6 - $N5;
print "$I2 generations in $N7 seconds. ";
$N8 = $I2;
$N1 = $N8 / $N7;
print "$N1 generations/sec\n";
#GC statistics deleted for perl version
# S15 has the incoming string, S0 is scratch, S1 is scratch, S2 is scratch
#
# I0 is the length of the string
# I1 is the current cell we're checking
# I2 is the count for that cell
# I3 is the offset to the neighbor
sub generate {
my ($I0, $I1, $I2, $I3);
$I0 = length($S15);
$S1 = "";
for ($I1 = 0; $I1 < $I0; $I1++) {
$I2 = 0;
$I3 = (-16 + $I0 + $I1) % $I0;
$I2++ if (substr($S15, $I3, 1) eq "*");
$I3 = (-15 + $I0 + $I1) % $I0;
$I2++ if (substr($S15, $I3, 1) eq "*");
$I3 = (-14 + $I0 + $I1) % $I0;
$I2++ if (substr($S15, $I3, 1) eq "*");
$I3 = (-1 + $I0 + $I1) % $I0;
$I2++ if (substr($S15, $I3, 1) eq "*");
$I3 = (1 + $I0 + $I1) % $I0;
$I2++ if (substr($S15, $I3, 1) eq "*");
$I3 = (14 + $I0 + $I1) % $I0;
$I2++ if (substr($S15, $I3, 1) eq "*");
$I3 = (15 + $I0 + $I1) % $I0;
$I2++ if (substr($S15, $I3, 1) eq "*");
$I3 = (16 + $I0 + $I1) % $I0;
$I2++ if (substr($S15, $I3, 1) eq "*");
if (substr($S15, $I1, 1) eq "*") {
if ($I2 < 2 or $I2 > 3) { $S1 .= " "; }
else { $S1 .= "*"; }
}
else {
if ($I2 == 3) { $S1 .= "*"; }
else { $S1 .= " "; }
}
}
$S15 = $S1;
}
# S15 has the incoming string, S0 is scratch
sub dump_life {
return if ($I12 > 0);
print "\f\n\n\n\n\n\n\n\n\n\n\n";
print "------------- generation $I0 -------------\n";
my ($I0, $I1);
for ($I0 = 0, $I1 = 14; $I1 >= 0; $I1--, $I0 += 15) {
$S0 = substr($S15, $I0, 15);
print "$S0\n";
}
#sleep 1;
}