Hi,bob,

You said:

3. It will probably be faster to use a single regex of the format:

    /pata|patb|patc|patd/


In fact maybe you are  wrong on this.Based on my test case,the RE written as 
below:

/pata/ || /patb/ || /patc/ || /patd/

is much faster than yours.


-----Original Message-----
>From: Bob Showalter <[EMAIL PROTECTED]>
>Sent: Dec 29, 2005 2:54 AM
>To: Jeff Pang <[EMAIL PROTECTED]>
>Cc: beginners@perl.org
>Subject: Re: why a.pl is faster than b.pl
>
>Jeff Pang wrote:
>> hi,lists,
>> 
>> I have two perl scripts as following:
>> 
>> a.pl:
>> ----
>> #!/usr/bin/perl
>> use strict;
>> 
>> my @logs = glob "~/logs/rcptstat/da2005_12_28/da.127.0.0.1.*";
>> 
>> foreach my $log (@logs) {
>> open (HD,$log) or die "$!";
>> while(<HD>){
>> 
>> if ( 
>> ($_ =~ /?¢²á/o) || 
>> ($_ =~ /?÷??/o) || 
>> ($_ =~ /?¥µ®¿ì??/) || 
>> ($_ =~ /?¦?¸/o) || 
>> ($_ =~ /?ø?¨/o) || 
>> ($_ =~ /·¢»õ/o) || 
>> ($_ =~ /±±¾©/o) || 
>> ($_ =~ /????/o) || 
>> ($_ =~ /???¢/o) || 
>> ($_ =~ /?ã?½/o) || 
>> ($_ =~ /°??ò/o) || 
>> ($_ =~ /?â·?/o) )  {
>> print $_;
>>    }
>>  }
>> close HD;
>> }
>> 
>> 
>> b.pl
>> ----
>> #!/usr/bin/perl
>> use strict;
>> 
>>   my $ref = sub { $_[0] =~ /?¢²á/o || $_[0] =~ /?÷??/o || $_[0] =~ 
>> /?¥µ®¿ì??/o ||
>>                   $_[0] =~ /?¦?¸/o || $_[0] =~ /?ø?¨/o || $_[0] =~ 
>> /·¢»õ/o ||
>>                   $_[0] =~ /±±¾©/o || $_[0] =~ /????/o || $_[0] =~ 
>> /???¢/o ||
>>                   $_[0] =~ /?ã?½/o || $_[0] =~ /°??ò/o || $_[0] =~ 
>> /?â·?/o };
>> 
>> 
>> my @logs = glob "~/logs/rcptstat/da2005_12_28/da.127.0.0.1.*";
>> 
>> foreach my $log (@logs) {
>> open (HD,$log) or die "$!";
>> while(<HD>){
>>     print if $ref->($_);
>>   }
>> close HD;
>> }
>> 
>> 
>> I run the 'time' command to get the running speed:
>> 
>> time perl a.pl > /dev/null 
>> 
>> real    0m0.190s
>> user    0m0.181s
>> sys     0m0.008s
>> 
>> 
>> time perl b.pl > /dev/null 
>> 
>> real    0m0.286s
>> user    0m0.278s
>> sys     0m0.007s
>> 
>> 
>> Why the a.pl is faster than b.pl? I think ever the resulte should be 
>> opposite.Thanks.
>> 
>
>Well, the time differences aren't dramatic. But off hand, I would say 
>that a.pl is faster because no subroutine call is involved.
>
>A couple of other observations:
>
>1. /o is useless on these regexes, since they don't interpolate any 
>variables.
>
>2. $_ is the default target for the m// operator, so
>
>    $_ =~ /regex/
>
>can be replaced with simply
>
>    /regex/
>
>3. It will probably be faster to use a single regex of the format:
>
>    /pata|patb|patc|patd/
>
>If the alternation can stay inside the regex code rather than happening 
>    out at the Perl opcode level, it might be faster.


--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to