Recently I was looking for the fastest way to clear an array I was using as a buffer. It had a specific length, it needed to have 'undef' for 'empty' values, and it may or may not have current values, plus it is going to be immediately refilled with 'real' values.

This isn't really something that's often needed: Anything is fast. But I was trying to squeeze every last bit of performance out of this code, so it mattered a bit.

Anyway, asking on the chatterbox got me several answers: Everyone seems to have an opinion, no one seems to know.

So I benchmarked. Here are the results for your trivia pleasure:

#!/usr/bin/perl use strict; use warnings; use Benchmark qw(cmpthese); my @working; $#working = 100; cmpthese( -10, { assign => '@working = (); $working[$_] = $_ foreach ( 0.. +.100 );', assign_undef => 'undef @working; $working[$_] = $_ foreach ( 0. +..100 );', assign_length => '@working = ()[0...100]; $working[$_] = $_ fore +ach ( 0...100 );', using_x => '@working = (undef) x 101; $working[$_] = $_ fo +reach ( 0...100 );', x_with_value => '@working = 1 x 101; $working[$_] = $_ foreach +( 0...100 );', } );

(The last is just to see if pre-filling with something approaching valid values makes a difference.)

Results:

Note these results are about as stable as you would expect seeing those close numbers: That is, not very. 'Assign' and 'assign_undef' are generally the fastest, but expect pair switching between any pair on any run. (With occasional far-switching.)

I went with 'assign'.

Edit: Updated to fix some testing methodology problems noted by ikegami below. Thanks.


In reply to Emptying (and refilling) an array. by DStaal

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.