Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re: How to access each char in a string most quickly?

by Marshall (Canon)
on Jul 03, 2009 at 07:15 UTC ( [id://776971]=note: print w/replies, xml ) Need Help??


in reply to How to access each char in a string most quickly?

I ran some benchmarks:
I used the previous code but added the "shift" case to the @array.

Update:When dealing with an @thing variable in Perl, using shift is an extremely efficient way to get the "top of the list". The benchmarks below show that. I got a comment that indicated that somebody didn't believe that, well check it out for yourself. But again, this is not about reading characters, it must or seems to be Perl's power is about recognizing pattern matches!

#!/usr/bin/perl -w use strict; use Benchmark qw[ cmpthese timethese]; my $string='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaa'; my @chars=split //,$string; cmpthese ( 1000000, { 'Substr'=>sub { my $string='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaa'; for (my $i=0;$i<length $string; $i++) { my $char=substr $string,$i,1; } }, 'pre_splitted'=>sub { foreach my $char (@chars) {} }, 'Split'=>sub { my @string=split //,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; foreach my $char (@string) {} }, 'Shift'=>sub { my @string='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaa'; shift @string;{} } } ); __END__ prints: Rate Split Substr pre_splitted Shift Split 8840/s -- -72% -94% -99% Substr 31465/s 256% -- -78% -95% pre_splitted 140667/s 1491% 347% -- -80% Shift 695410/s 7767% 2110% 394% --

Replies are listed 'Best First'.
Re^2: How to access each char in a string most quickly?
by citromatik (Curate) on Jul 03, 2009 at 08:14 UTC
    { my @string='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaa'; shift @string;{} }

    This is nonsense, did you mean?

    my @string = ('a')x50; while (shift @string){ ; }

    citromatik

      I am striking this whole post as this didn't work out very well. Somehow the main point just got completely lost. Perl is not a great character by character language and its just not the right way to use Perl, but somehow I wasn't able to get this across. Oooops. Yes. You are correct!!.

      This whole thread is a bit weird as the idea of processing a char at a time is sort of "anti-Perl".

       The code should be: while (my $var =shift @string){} But that makes no difference.

      Rate Split Substr pre_splitted Shift Split 8851/s -- -73% -94% -98% Substr 32226/s 264% -- -80% -95% pre_splitted 158028/s 1685% 390% -- -73% Shift 587199/s 6534% 1722% 272% --

      The main point is that shift() is very, very fast, but Perl will work with regex even faster. I mean so what do you do with these chars that were read individually?

      Update: Well Darn! the code above is not right, and I think I could write some faster "get a character" code, but that is just not the point at all!

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (4)
As of 2024-03-28 22:28 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found