Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Does it Iactually/I run faster?

by greenhorn (Sexton)
on Jul 04, 2000 at 05:53 UTC ( [id://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?

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
Domain Nodelet?
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?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (4)
As of 2024-04-25 04:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found