Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Re: Re: Re: Idiomatic optimizations

by hakkr (Chaplain)
on Apr 30, 2002 at 11:40 UTC ( #163027=note: print w/ replies, xml ) Need Help??


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


Comment on Re: Re: Re: Idiomatic optimizations
Select or Download Code
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.
    

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (5)
As of 2015-07-03 23:22 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (57 votes), past polls