Ich habe das mal mit dem Code getestet:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw/cmpthese/;
my $lng = shift(@ARGV) || die "Usage: $0 length [-count]\n";
my $cnt = shift(@ARGV) || "-10";
cmpthese ($cnt,
{
'Version 1' => sub { push_fast($lng) },
'Version 2' => sub { cnt_fast1($lng) },
'Version 3' => sub { cnt_fast1($lng) }
}
);
sub push_fast
{
my $l=shift(@_);
my @arr;
map{ push(@arr,"TEST") }(0..$l);
}
sub cnt_fast1
{
my $l=shift(@_);
my @arr=(0)x$l;
my $c=0;
map{ $arr[$c++]="TEST" }(0..$l);
}
sub cnt_fast2
{
my $l=shift(@_);
my @arr;
$#arr = $l;
my $c=0;
map{ $arr[$c++]="TEST" }(0..$l);
}
Die Ergebnisse
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
> ./array_fast_test.pl
Usage: ./array_fast_test.pl length [-count]
> ./array_fast_test.pl 100 -10
Rate Version 2 Version 3 Version 1
Version 2 8548/s -- -1% -13%
Version 3 8599/s 1% -- -12%
Version 1 9780/s 14% 14% --
> ./array_fast_test.pl 1000 -10
Rate Version 3 Version 2 Version 1
Version 3 867/s -- -0% -13%
Version 2 868/s 0% -- -13%
Version 1 995/s 15% 15% --
> ./array_fast_test.pl 10000 -10
Rate Version 2 Version 3 Version 1
Version 2 53.3/s -- -0% -15%
Version 3 53.4/s 0% -- -15%
Version 1 63.0/s 18% 18% --
> ./array_fast_test.pl 100000 -10
Rate Version 2 Version 3 Version 1
Version 2 5.05/s -- -0% -20%
Version 3 5.06/s 0% -- -20%
Version 1 6.34/s 25% 25% --
> ./array_fast_test.pl 1000000 -10
s/iter Version 2 Version 3 Version 1
Version 2 2.05 -- -1% -20%
Version 3 2.03 1% -- -19%
Version 1 1.64 25% 24% --
Für sich alleine getestet ist "push" doch am schnellten, immer.
Warum ich vorher anere Ergebnisse hatte kann nur daran liegen, das ich nur die vorherigen Codestücke modifieziert hatte, und es da Konvergenzen gab.