From: <[EMAIL PROTECTED]>
> Well,
> 
> All the above said answers are perfectly fine, but just to make it
> more efficient what we can do is, we can avoid the if statement or ?:
> operator.
> 
> This is because whenever we go for a decision statement, it takes some
> extra processing time.

Whenever we index an array it takes some extra processing time as 
well.
 
> A solution to avoid using if or ?: is as follows:
> 
> #!/usr/bin/perl
> use strict;
> 
> my @string = ("Even", "Odd");
> print $string[$ARGV[0]%2];
> 
> Well it might look like the savings in time is less, but if you
> consider that this code is inside a loop which will run for several
> iterations, you are sacing lot of time.... Hence the program becomes
> more efficient.

Before you say something like this you should test it:

        use Benchmark;
        
        sub withIf {
                my $number_is = '';
                for (1..100000) {
                        if ($_ % 2) {
                                $number_is = 'Odd';
                        } else {
                                $number_is = 'Even';
                        }
                }
        }
        
        sub withQm {
                my $number_is = '';
                for (1..100000) {
                        $number_is = ($_ % 2) ? 'Odd' : 'Even';
                }
        }
        
        sub withIfAnd {
                my $number_is = '';
                for (1..100000) {
                        if ($_ & 1) {
                                $number_is = 'Odd';
                        } else {
                                $number_is = 'Even';
                        }
                }
        }
        
        sub withQmAnd {
                my $number_is = '';
                for (1..100000) {
                        $number_is = ($_ & 1) ? 'Odd' : 'Even';
                }
        }
        
        my @what = qw(Even Odd);
        sub withAry {
                my $number_is = '';
                for (1..100000) {
                        $number_is = $what[$_ % 2];
                }
        }
        
        sub withAryAnd {
                my $number_is = '';
                for (1..100000) {
                        $number_is = $what[$_ & 1];
                }
        }
        
        timethese 100, {
                withIf => \&withIf,
                withQm => \&withQm,
                withIfAnd => \&withIfAnd,
                withQmAnd => \&withQmAnd,
                withAry => \&withAry,
                withAryAnd => \&withAryAnd,
        }


Benchmark: timing 100 iterations of withAry, withAryAnd, withIf, 
withIfAnd, withQm, withQmAnd...
   withAry:  6 wallclock secs ( 5.67 usr +  0.00 sys =  5.67 CPU) @ 
17.63/s (n=100)
withAryAnd:  5 wallclock secs ( 5.20 usr +  0.02 sys =  5.22 CPU) @ 
19.16/s (n=100)
    withIf:  6 wallclock secs ( 6.09 usr +  0.01 sys =  6.11 CPU) @ 
16.37/s (n=100)
 withIfAnd:  6 wallclock secs ( 5.77 usr +  0.00 sys =  5.77 CPU) @ 
17.35/s (n=100)
    withQm:  5 wallclock secs ( 5.05 usr +  0.00 sys =  5.05 CPU) @ 
19.81/s (n=100)
 withQmAnd:  5 wallclock secs ( 4.73 usr +  0.00 sys =  4.73 CPU) @ 
21.12/s (n=100)

(Using Perl v5.8.0 ActiveState build 805 on Win2k server)

So it seems the ?: is actually fastest ;-)

Jenda
===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz =====
When it comes to wine, women and song, wizards are allowed 
to get drunk and croon as much as they like.
        -- Terry Pratchett in Sourcery


-- 
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