http://qs321.pair.com?node_id=109656


in reply to How expensive is reverse?

I'm not sure how they are implemented or what the (O) is (I suspect it's O(n)). Here's what a quick benchmark says from my Dual Celeron 400:
#!/usr/bin/perl use Benchmark; @one = ('a' x 100); @two = ('a' x 1000); @three = ('a' x 10000); timethese( 100000, { 'rev 100' => sub { reverse @one }, 'rev 1000' => sub { reverse @two }, 'rev 10000' => sub { reverse @three }, } );
Gives me this:
Benchmark: timing 100000 iterations of rev 100, rev 1000, rev 10000... rev 100: 1 wallclock secs ( 0.24 usr + 0.00 sys = 0.24 CPU) @ 41 +6666.67/s (n=100000) (warning: too few iterations for a reliable count) rev 1000: 1 wallclock secs ( 0.87 usr + 0.00 sys = 0.87 CPU) @ 11 +4942.53/s (n=100000) rev 10000: 8 wallclock secs ( 7.65 usr + 0.00 sys = 7.65 CPU) @ 13 +071.90/s (n=100000)
At a 100,000 iterations of a 1,000 element list, it took 0.87 seconds of CPU time. Not too expensive I'd say.

Updated CRAP! nardo is quite right. I hate it when I make silly mistakes.

/\/\averick
perl -l -e "eval pack('h*','072796e6470272f2c5f2c5166756279636b672');"

Replies are listed 'Best First'.
Re: Re: How expensive is reverse?
by nardo (Friar) on Sep 01, 2001 at 22:08 UTC
    ITYM
    @one = (('a') x 100); @two = (('a') x 1000); @three = (('a') x 10000);
    As it is written each array has one element 100, 1000, or 10000 characters long rather than having 100, 1000, or 10000 elements one character long. With this change (and changing it to run 10,000 times) I get:
    Benchmark: timing 10000 iterations of rev 100, rev 1000, rev 10000... rev 100: 0 wallclock secs ( 0.54 usr + -0.01 sys = 0.53 CPU) @ 18 +867.92/s (n=10000) rev 1000: 4 wallclock secs ( 5.52 usr + -0.01 sys = 5.51 CPU) @ 18 +14.88/s (n=10000) rev 10000: 59 wallclock secs (58.33 usr + -0.00 sys = 58.33 CPU) @ 17 +1.44/s (n=10000)