note
Abigail-II
I think your benchmark is flawed. I don't think your
append code is doing what you think it's doing. Witness:
<code>
my $buffer .= "x" x 1024 for 0 .. 5;
print length $buffer;
</code>
<p>
<tt>$buffer</tt> is uninitialized by the time it reached
the <tt>print</tt>. Moving the declaration away from the
assignment fixes this.
<p>
Furthermore, both fragments don't produce the same result.
The 'push' variant keeps everything in an array - it ought
to have final join, IMO.
<p>
Here's a somewhat different benchmark. It also shows the
append method to be faster, and much faster than I expected
it to be.
<code>
#!/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 seconds...
Rate push64k_100 append64k_100
push64k_100 22.5/s -- -76%
append64k_100 94.7/s 320% --
</code>
<p>
Abigail
277781
277786