Your sort is almost certainly the dominant part of the runtime. The sort takes O(n log n) time, while passing an array takes O(n) time, so the sort will overshadow differences in parameter passing as the inputs get larger. I'd use an operation inside the sub that also runs in linear time (like summing the elements).

There's also the fact that I'm pretty sure that @{$_[0]} as an argument to sort ends up making a copy of the array anyway. I'd avoid using the passed array in list context at all within your benchmark. Access the items by their indices to avoid any unwanted copying:

use Benchmark 'cmpthese'; my @data = map { rand } 0 .. 4000; cmpthese(-2, { copy => sub { copy(@data) }, ref => sub { ref(\@data) } }); sub copy { my $sum; $sum += $_[$_] for 0 .. $#_; return $sum +} sub ref { my $sum; $sum += $_[0][$_] for 0 .. $#{$_[0]}; return $sum +} __END__ Rate copy ref copy 370/s -- -100% ref 1884708/s 508700% --
Update: Fixed really dumb error (didn't pass anything to the subs). Code reflects changes (and copy vs. ref is an even bigger difference than before). Thanks bmann.

blokhead


In reply to Re: Show that using references is faster by blokhead
in thread Show that using references is faster by Keystroke

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.