[Moscow.pm] Как очистить массив

Mons Anderson mons на cpan.org
Вс Май 30 06:05:25 PDT 2010


Странно спорить на голом месте.
вот бенчмарк.

use Benchmark qw(:all :hireswallclock);
my $size = 1000;
cmpthese timethese -3, {
    '@a = ...'          => sub { my @a = (('test')x$size);
        return; },
    'undef @a'          => sub { my @a = (('test')x$size); undef @a;
        return; },
    '@a=()'             => sub { my @a = (('test')x$size); @a = ();
        return; },
    'splice @a'         => sub { my @a = (('test')x$size); splice @a;
        return; },
    '$#a = -1'          => sub { my @a = (('test')x$size); $#a = -1;
        return; },
    'shift @a while @a' => sub { my @a = (('test')x$size); shift @a
while @a;  return; },
    'delete @a[0..#$a]' => sub { my @a = (('test')x$size);
delete(@a[0..$#a]); return; },
};

при $size=1000;
shift @a while @a 2642/s                --              -22%      -44%
    -44%  -45%     -45%     -45%
delete @a[0..#$a] 3376/s               28%                --      -28%
    -29%  -29%     -30%     -30%
splice @a         4722/s               79%               40%        --
     -0%   -1%      -2%      -2%
undef @a          4745/s               80%               41%        0%
      --   -1%      -2%      -2%
@a=()             4781/s               81%               42%        1%
      1%    --      -1%      -1%
$#a = -1          4834/s               83%               43%        2%
      2%    1%       --      -0%
@a = ...          4834/s               83%               43%        2%
      2%    1%       0%       --

при $size = 100;
shift @a while @a 25428/s                --              -27%     -43%
     -45%     -46%  -47%     -47%
delete @a[0..#$a] 34689/s               36%                --     -23%
     -25%     -27%  -27%     -28%
$#a = -1          44823/s               76%               29%       --
      -4%      -5%   -6%      -6%
splice @a         46547/s               83%               34%       4%
       --      -2%   -2%      -3%
undef @a          47424/s               87%               37%       6%
       2%       --   -1%      -1%
@a=()             47669/s               87%               37%       6%
       2%       1%    --      -0%
@a = ...          47908/s               88%               38%       7%
       3%       1%    1%       --

при $size=10;
shift @a while @a 206027/s                --              -20%
-32%      -40%  -42%     -42%     -45%
delete @a[0..#$a] 257112/s               25%                --
-15%      -26%  -28%     -28%     -31%
$#a = -1          302268/s               47%               18%
--      -13%  -15%     -15%     -19%
splice @a         345669/s               68%               34%
14%        --   -3%      -3%      -8%
@a=()             355783/s               73%               38%
18%        3%    --      -0%      -5%
undef @a          356498/s               73%               39%
18%        3%    0%       --      -5%
@a = ...          374747/s               82%               46%
24%        8%    5%       5%       --

итого:
правильные способы:
@a = ();
$#a = -1;
undef @a;
splice @a;
они различаются на проценты и вобщем-то при разных запусках могут
меняться местами.

shift while и delete - crap.

-- 
Best wishes,
Vladimir V. Perepelitsa aka Mons Anderson
<inthrax на gmail.com>, <mons на cpan.org>


Подробная информация о списке рассылки Moscow-pm