in reply to Performance optimization question

A casual test showed a > 40% improvement by omitting the intermediate array:

my @arr1 = grep { /reg exp/ } split /\|/, $string; Rate orig A orig 232/s -- -30% A 331/s 43% --

And if the lack of mys and the need to set the length of the array in your code indicates you are using globals instead of lexicals, note that lexicals are usually a few percent faster.

A lot will depend upon how long the string is, how many elements it splits into, the complexity of /reg exp/, and the proportion of elements beig excluded. More info might yield better responses.


Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
"Too many [] have been sedated by an oppressive environment of political correctness and risk aversion."

Replies are listed 'Best First'.
Re^2: Performance optimization question
by jwkrahn (Abbot) on Apr 03, 2008 at 00:58 UTC

    If you want it really fast get rid of the braces as well:

    my @arr1 = grep /reg exp/, split /\|/, $string;

      Yes. I forget how much difference that can make. Though joost's idea (with several modifications) works out fastest:

      #! perl -slw use strict; use Data::Dump qw[ pp ]; use Benchmark qw[ cmpthese ]; our $string = join '|', map{ join rand() < 0.2 ? 'fred' : 'bill', 'pqr', 'xyz' } 1 .. 10000; our $first = 0; our %counts; cmpthese -1, { orig => q[ my @arr = split(/\|/, $string); my @arr1 = grep { /fred/ } @arr; $counts{ orig } = @arr1; ], Buk1 => q[ my @arr1 = grep { /fred/ } split /\|/, $string; $counts{ Buk1 } = @arr1; ], jwkrahn => q[ my @arr1 = grep /fred/, split /\|/, $string; $counts{ jwkrahn } = @arr1; ], Buk2 => q[ my @arr1 = $string =~ m[(?:^|\|)(.*?fred.*?)(?=\||$)]g; $counts{ Buk2 } = @arr1; ], JOOST => q[ my @arr1 = $string =~ /(?:^|\|)([^|]*?fred[^|]*?)(?=\||$)/g; $counts{ JOOST } = @arr1; ], }; pp \%counts; __END__ c:\test>junk6 Rate orig Buk1 JOOST jwkrahn Buk2 orig 20.2/s -- -28% -48% -58% -84% Buk1 28.1/s 39% -- -28% -42% -77% JOOST 39.2/s 94% 39% -- -19% -68% jwkrahn 48.4/s 140% 72% 24% -- -61% Buk2 124/s 515% 342% 217% 157% -- { Buk1 => 2010, Buk2 => 2010, JOOST => 2010, jwkrahn => 2010, orig => +2010 }

      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.

        I get slightly different results:

        $ perl -le' open D, q[/usr/share/dict/words] or die $!; my $string = join "|", <D>; use Benchmark qw/cmpthese/; cmpthese -20, { orig => sub { my @arr = split /\|/, $string; my @arr1 = grep { /oug/ } @arr; return @arr1; }, Buk1 => sub { my @arr1 = grep { /oug/ } split /\|/, $string; return @arr1; }, jwkrahn => sub { my @arr1 = grep /oug/, split /\|/, $string; return @arr1; }, Buk2 => sub { my @arr1 = $string =~ /(?:^|\|)(.*?oug.*?)(?=\||$)/g; return @arr1; }, JOOST => sub { my @arr1 = $string =~ /(?:^|\|)([^|]*?oug[^|]*?)(?=\||$)/g; return @arr1; }, }; ' Rate JOOST Buk2 orig Buk1 jwkrahn JOOST 4.37/s -- -10% -13% -38% -67% Buk2 4.87/s 11% -- -4% -31% -63% orig 5.05/s 15% 4% -- -28% -62% Buk1 7.05/s 61% 45% 40% -- -47% jwkrahn 13.2/s 202% 171% 162% 87% --
          YMMV   :-)

        THANK YOU ALL!! I really appreciate, extremely useful !!!