Andrew savige wrote:
>
> sub a1 { my @lines = split(/^/, $x, -1); chomp(@lines) }
> sub a2 { my @lines = $x eq "" ? () : $x =~ /^.*/mg }
> sub j1 { my @lines = map { chomp; $_ } split /^/, $x, -1 }
> # w1 is Perl 5.8.0 only
> sub w1 { open(my $fh, "<", \$x); my @lines = <$fh>; chomp(@lines) }
> timethese(600000, {
> 'a1' => \&a1,
> 'a2' => \&a2,
> 'j1' => \&j1,
> 'w1' => \&w1,
> });
>
> Results on Linux, Perl 5.8.0:
> a1: 27 wallclock secs (15.06 usr + 0.01 sys = 15.07 CPU)
> a2: 42 wallclock secs (24.06 usr + 0.04 sys = 24.10 CPU)
> j1: 49 wallclock secs (27.84 usr + 0.04 sys = 27.88 CPU)
> w1: 101 wallclock secs (62.74 usr + 0.04 sys = 62.78 CPU)
>
> Why is a1 fastest? Not sure, but I noticed in the Camel re split:
> "the patterns /\s+/, /^/ and / / are specially optimized".
You can speed up a1 a hair by chomp'ing the assignment.
sub a1 { chomp( my @lines = split(/^/, $x, -1) ) }
You can also speed up j1 by using map without the braces.
sub j1 { my @lines = map chomp && $_, split /^/, $x, -1 }
John
--
use Perl;
program
fulfillment