Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re: Using the Substr

by Kenosis (Priest)
on Mar 04, 2014 at 21:22 UTC ( [id://1076959]=note: print w/replies, xml ) Need Help??


in reply to Using the Substr

If you decide to go with split/join and have quite a few strings to process, consider setting split's LIMIT parameter to 4 (since you're only interested in the first three resulting elements), as this can significantly speed up processing w/o compromising readability:

use strict; use warnings; use Benchmark qw/cmpthese/; my $string = '1:13:1:6:5854:0x00E37F06:0x00D1314C'; sub _split { my $result = join( ':', ( split /:/, $string )[ 0 .. 2 ] ); } sub _split_LIMIT { my $result = join( ':', ( split /:/, $string, 4 )[ 0 .. 2 ] ); } cmpthese( -5, { _split => sub { _split() }, _split_LIMIT => sub { _split_LIMIT() } } );

Output (faster times are lower in the table):

Rate _split _split_LIMIT _split 938083/s -- -25% _split_LIMIT 1248002/s 33% --

Replies are listed 'Best First'.
Re^2: Using the Substr
by AnomalousMonk (Archbishop) on Mar 04, 2014 at 23:06 UTC

    The advantage of limited over unlimited split is more pronounced if a redundant subroutine call and lexical creation are not included, with regex extraction thrown in for good measure:

    c:\@Work\Perl>perl -wMstrict -le "use Benchmark qw/cmpthese/; ;; my $string = '1:13:1:6:5854:0x00E37F06:0x00D1314C'; my $result; ;; sub _split { $result = join ':', (split /:/, $string)[0 .. 2]; } ;; sub _split_LIMIT { $result = join ':', (split /:/, $string, 4)[0 .. 2]; } ;; sub _regex { ($result) = $string =~ m{ \A \d+ : \d+ : \d+ }xmsg; } ;; cmpthese(-5, { _split => \&_split, _split_LIMIT => \&_split_LIMIT, _regex => \&_regex, }); " Rate _split _split_LIMIT _regex _split 261407/s -- -39% -54% _split_LIMIT 425387/s 63% -- -24% _regex 562521/s 115% 32% --

      I wondered if index and substr would be any quicker but, no, it came in a bit behind &_split_LIMIT.

      use strict; use warnings; use Benchmark qw{ cmpthese }; my $string = q{1:13:1:6:5854:0x00E37F06:0x00D1314C}; my $result; sub _index { my $pos3 = -1; $pos3 = index $string, q{:}, $pos3 + 1 for 1 .. 3; $result = substr $string, 0, $pos3; } sub _split { $result = join ':', (split /:/, $string)[0 .. 2]; } sub _split_LIMIT { $result = join ':', (split /:/, $string, 4)[0 .. 2]; } sub _regex { ($result) = $string =~ m{ \A \d+ : \d+ : \d+ }xmsg; } cmpthese( -5, { _index => \&_index, _split => \&_split, _split_LIMIT => \&_split_LIMIT, _regex => \&_regex, } );
      Rate _split _index _split_LIMIT _r +egex _split 657900/s -- -26% -31% +-38% _index 890097/s 35% -- -7% +-17% _split_LIMIT 952857/s 45% 7% -- +-11% _regex 1066336/s 62% 20% 12% + --

      I hope this is of interest.

      Cheers,

      JohnGG

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1076959]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (4)
As of 2024-04-25 06:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found