Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
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?

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 wandering the Monastery: (6)
As of 2016-10-01 21:51 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    How many different varieties (color, size, etc) of socks do you have in your sock drawer?






    Results (8 votes). Check out past polls.