http://www.perlmonks.org?node_id=163027


in reply to Re: Re: Idiomatic optimizations
in thread Idiomatic optimizations

Always pass referances not data structures hence \ operator is an optimistaion sub(\@array) instead of sub(@array)
Only use what you need from modules use CGI qw(:standard);
Also I like shortcut operators
my $i ||=0 ; my $i =shift || 0;
also I like ? operator instead of if's
$i?$i=1:$i=0;
is !~ an optimisation over just negating the result of =~, I dunno but I think !~ looks better

Replies are listed 'Best First'.
Re: Re: Re: Re: Idiomatic optimizations
by Joost (Canon) on May 01, 2002 at 08:29 UTC
    Just a few remarks (though i've got a sneaking suspicion i'm correcting typos here):

    > my $i ||=0 ;

    here $i will always turn out to be 0 (because of the my operator), so my $i=0; is more efficient.

    > $i?$i=1:$i=0;
    How about $i=$i?1:0; - that's also a bit more readable. (at least to my eyes).

    Joost.

Re^4: Idiomatic optimizations
by tadman (Prior) on May 01, 2002 at 08:37 UTC
    Don't forget that ?: can get dangerous, not unlike juggling running chainsaws. It's a great show, but is liable to injure yourself something fierce:
    $foo = $a? $b? $c : $d? $e : $f : $g : $h;
    Sometimes an if is more verbose, but undeniably precise.

    Instead of getting carried away with ?:, you can sometimes compact it using the regular logical operators || and &&. It really depends on what you're working with.
      Hmm I sort of agree with your point, but Im troubled by your fierce but syntactically incorrect example (ternary ops should always have the same number of '?' as ':' )
      $a=1;$b=2;$c=3;$d=4;$f=5;$g=6;$h=7; $foo = $a? $b? $c : $d? $e : $f : $g : $h; print $foo; __END__ syntax error at C:\temp\ternary.pl line 2, near "$g :" Execution of C:\temp\ternary.pl aborted due to compilation errors.
      I believe that you meant to say
      $foo = $a ? $b ? $c : $d ? $e : $f : $g;
      My personal rule of thumb is that ternary ops should not be nested but may be chained. Thus I would say that your example could be rewritten
      $foo = !$a ? $g : $b ? $c : $d ? $e : $f;
      And its a little less troublesome. Even then I personally would add some whitespace so it would look like
      $foo = !$a ? $g : $b ? $c : $d ? $e : $f;
      This and a bit of paretheses would also help your nested example
      $foo = $a ? ($b ? $c : ($d ? $e : $f)) : $g;
      I find that formatting ternaries like this makes them only marginally more difficult to read than if statements, but I still tend to avoid nested ternaries.

      Yves / DeMerphq
      ---
      Writing a good benchmark isnt as easy as it might look.

Re: Re: Re: Re: Idiomatic optimizations
by Juerd (Abbot) on May 01, 2002 at 16:44 UTC

    $i?$i=1:$i=0;

    Puh-lease, use some whitespace! Here are some alternatives:

    $i ? $i = 1 : $i = 0; $i = $i ? 1 : 0; $i = !!$i || 0; $foo = $foo ? 1 : 0; # Single-letter variable names: # easy to type, hard to read

    Always pass referances not data structures

    Most references are the root of data structures, so I think you meant "Always pass references instead of flattened hashes or lists". Note that you can't use this if the sub in question doesn't expect it.

    - Yes, I reinvent wheels.
    - Spam: Visit eurotraQ.