I think your benchmark is flawed. I don't think your
append code is doing what you think it's doing. Witness:
my $buffer .= "x" x 1024 for 0 .. 5;
print length $buffer;
$buffer is uninitialized by the time it reached
the print. Moving the declaration away from the
assignment fixes this.
Furthermore, both fragments don't produce the same result.
The 'push' variant keeps everything in an array - it ought
to have final join, IMO.
Here's a somewhat different benchmark. It also shows the
append method to be faster, and much faster than I expected
it to be.
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw /cmpthese/;
our $str;
our ($a, $b);
for our $t (5, 10, 100) {
for my $n (1, 8, 64) {
$str = "x" x ($n * 1024);
cmpthese -3, {
"append${n}k_$t" => '$::a = ""; $::a .= $::str for 1 .. $:
+:t;',
"push${n}k_$t" => 'my @s; push @s => $::str for 1 .. $:
+:t;
$::b = join "" => @s',
};
die "Benchmark is wrong\n" unless length ($a) == $t * length $
+str &&
length ($b) == $t * length $
+str;
}
}
__END__
Benchmark: running append1k_5, push1k_5 for at least 3 CPU seconds...
Rate push1k_5 append1k_5
push1k_5 91330/s -- -58%
append1k_5 219880/s 141% --
Benchmark: running append8k_5, push8k_5 for at least 3 CPU seconds...
Rate push8k_5 append8k_5
push8k_5 33834/s -- -50%
append8k_5 67846/s 101% --
Benchmark: running append64k_5, push64k_5 for at least 3 CPU seconds..
+.
Rate push64k_5 append64k_5
push64k_5 460/s -- -92%
append64k_5 5705/s 1139% --
Benchmark: running append1k_10, push1k_10 for at least 3 CPU seconds..
+.
Rate push1k_10 append1k_10
push1k_10 53627/s -- -60%
append1k_10 135692/s 153% --
Benchmark: running append8k_10, push8k_10 for at least 3 CPU seconds..
+.
Rate push8k_10 append8k_10
push8k_10 16317/s -- -67%
append8k_10 48795/s 199% --
Benchmark: running append64k_10, push64k_10 for at least 3 CPU seconds
+...
Rate push64k_10 append64k_10
push64k_10 221/s -- -85%
append64k_10 1510/s 583% --
Benchmark: running append1k_100, push1k_100 for at least 3 CPU seconds
+...
Rate push1k_100 append1k_100
push1k_100 5730/s -- -60%
append1k_100 14175/s 147% --
Benchmark: running append8k_100, push8k_100 for at least 3 CPU seconds
+...
Rate push8k_100 append8k_100
push8k_100 185/s -- -84%
append8k_100 1181/s 537% --
Benchmark: running append64k_100, push64k_100 for at least 3 CPU secon
+ds...
Rate push64k_100 append64k_100
push64k_100 22.5/s -- -76%
append64k_100 94.7/s 320% --
Abigail |