From:                   Bob Showalter <[EMAIL PROTECTED]>
> Tim Musson wrote:
> > Hey all,
> > 
> >   I need to return the largest of 3 vars. Is there a better way than
> >   nested IF statements? Maybe put them in an array and sort it?
> 
> You can write the sort without needing a separate array:
> 
>    $max = (sort {$b<=>$a} ($x, $y, $z))[0];
> 
> Or, you can do something like this
> 
>    $max = ($max = ($x > $y) ? $x : $y) > $z ? $max : $z;
> 
> (I'm sure somebody can simplify that)
> 
> If you get more than 3 vars, the sort is probably the cleanest way to
> write it.

Just for kicks I benchmarked a few solutions:

#!perl
use Benchmark;
use strict;
my $x = 4;
my $y = 2;
my $z = 45;

sub Bob2 {
        my $max;
        $max = ($max = ($x > $y) ? $x : $y) > $z ? $max : $z;
        return $max;
}

sub Bob {
        my $max = (sort {$b<=>$a} ($x, $y, $z))[0];
        return $max;
}

sub GetLast {
        my $max = (sort ($x, $y, $z))[-1];
        return $max;
}

sub ListContext {
        my ($max) = sort {$b<=>$a} ($x, $y, $z);
        return $max;
}

sub For3If {
        my $max = $x;$max = ($_ > $max ? $_ : $max) for ($x, $y, $z);
        return $max;
}

sub ForModIf {
        my $max = $x; for ($x, $y, $z) {$max = $_ if $_ > $max};
        return $max;
}


timethese 1000000, {
        Bob => \&Bob,
        Bob2 => \&Bob2,
        GetLast => \&GetLast,
        ListContext => \&ListContext,
        For3If => \&For3If,
        ForModIf => \&ForModIf,
};
__END__

Benchmark: timing 1000000 iterations of Bob, Bob2, Bob2J, For3If, 
ForModIf, GetL
ast, ListContext...
       Bob:  3 wallclock secs ( 2.55 usr +  0.00 sys =  2.55 CPU) 
                @ 391696.04/s (n=1000000)
      Bob2:  2 wallclock secs ( 1.51 usr +  0.00 sys =  1.51 CPU) 
                @ 660938.53/s (n=1000000)
    For3If:  6 wallclock secs ( 5.36 usr +  0.00 sys =  5.36 CPU) 
                @ 186636.80/s (n=1000000)
  ForModIf:  4 wallclock secs ( 5.09 usr +  0.00 sys =  5.09 CPU) 
                @ 196579.52/s (n=1000000)
   GetLast:  2 wallclock secs ( 2.75 usr +  0.00 sys =  2.75 CPU) 
                @ 363108.21/s (n=1000000)
ListContext:  3 wallclock secs ( 2.31 usr +  0.00 sys =  2.31 CPU) 
                @ 432338.95/s (n=1000000)
(Look at the CPU time, not the wallclock!)

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]

Reply via email to