Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

Does it Iactually/I run faster?

by greenhorn (Sexton)
on Jul 04, 2000 at 05:53 UTC ( #20970=perlquestion: print w/ replies, xml ) Need Help??
greenhorn has asked for the wisdom of the Perl Monks concerning the following question:

I use an IDE for perl (Perl Builder). As with other such programs: the statement that's about to be executed is highlighted just before you execute it. Then the highlight-bar "lands" on the next statement.

In a case like the one just below, the highlight-bar "lands" on the substitutions as many times as there are elements in the array:

for ( @array ) { s/\s+/\t/; s/elementary/my dear Watson/g; }

But if the routine is re-written as follows: do {s/\s+/\t/; s/elementary/my dear Watson/g;} for @array;

. . . the cursor "lands" there only once. The entire array appears to be processed in a single step. I've assumed that this difference is simply an artifact of the way the IDE displays what it's doing. But considering how quickly the one-liner seems to execute in the IDE--even when the array is rather large--it got me wondering: does making such routines as terse as possible actually improve execution speed?

Comment on Does it Iactually/I run faster?
Select or Download Code
Replies are listed 'Best First'.
Re: Does it Iactually/I run faster?
by nardo (Friar) on Jul 04, 2000 at 06:20 UTC
    Benchmarking it on my machine shows the multi line version running faster than the one liner.
    use Benchmark; @array = ('elementary school', 'blah blah blah', 'stuff', 'hello', 'ya +y'); timethese(100000, { 'one line' => '&one_line', 'multi line' => '&multi_line'}); sub one_line { do {s/\s+/\t/; s/elementary/my dear Watson/g;} for @array; } sub multi_line { for ( @array ) { s/\s+/\t/; s/elementary/my dear Watson/g; } }

    Output:
    multi line: 5 wallclock secs ( 5.04 usr + -0.01 sys = 5.03 CPU) @ 19880.72/s (n=100000)
    one line: 5 wallclock secs ( 5.72 usr + 0.00 sys = 5.72 CPU) @ 17482.52/s (n=100000)
      This can't be true, because:
      d:\>perl -MO=Deparse -e "do {s/\s+/\t/; s/elementary/my dear Watson/g; +} for @array;" foreach $_ (@array) { s/\s+/\t/; s/elementary/my dear Watson/g;; } -e syntax OK

      You machine probably was overloaded with some extra tasks second time. And I beleive multiline version compiled into the same code internally.

        Sweet! writing obfusicated code just got a lot harder.
        Maverick goes pouring through the docs on B

        /\/\averick

        holy crap! that is the coolest thing i have seen in forever, I had NO idea you could do that! -MO=Deparse... wow, I am angered that i can only ++ this once, that is one of the most useful things I have seen in forever! Thank you!

      Thanks on two accounts (the second being: reading your message, now I have an idea how to use Benchmark).

      The results here confirm what you observed:

      Benchmark: timing 500000 iterations of multi line, one line... multi line: 12 wallclock secs (12.31 usr + 0.00 sys = 12.31 CPU) one line: 16 wallclock secs (14.64 usr + 0.00 sys = 14.64 CPU)

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (9)
As of 2015-07-08 03:20 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 (93 votes), past polls