Thread Array teilen
(9 answers)
Opened by rosti at 2011-07-14 17:40 2011-07-15T11:39:52 pq Das ist soweit schon richtig, allerdings denke ich, dass @old wohl trotzdem Platz für so viele Skalare belegt, wie an Daten vorher drin gespeichert wurden. Wie bei einem void* a[1000]: der wird auch nicht kleiner nur weil ich seine Elemente auf 0 setze. Ob das hier aber eine Rolle spielt? Ich wage es mal zu bezweifeln. Man müsste den tatsächlichen Overhead einfach mal messen: Code (perl): (dl
)
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 #!/usr/bin/perl use 5.010; use strict; use warnings; use autodie; use Devel::Size qw< total_size >; sub size (&@) { my ($code, $count, $name) = @_; my @test; push @test, $code->($_) for 1..$count; my $full = total_size(\@test); splice @test, 0, @test; my $empty = total_size(\@test); say "\n$name\nfull: $full\nempty: $empty\nratio: ", $empty/$full; } size { bless {} } 100_000, "object"; size { 1 } 100_000, "integer"; size { 3.14159 } 100_000, "number"; size { 'a' } 100_000, "single character string"; size {'a' x 10} 100_000, "string (10)"; size {'a' x 100} 100_000, "string (100)"; size {'a' x 1_000} 100_000, "string (1_000)"; liefert: Code: (dl
)
1 object Wie man sieht, ist der Overhead in allen Fällen gleich groß und im Verhältnis zum gefüllten Array nicht zu unterschätzen, wenn auch ~0.5 MiB so gut wie nichts ist. Wenn es denn unbedingt ohne Kopie sein soll, ersetzt man eben in dem Array selbst: Code (perl): (dl
)
1 2 $data[$_] = [@data[$_*3..$_*3+2]] for 0..$#data/3; $#data = $#data/3; # neue Länge setzen Das ist aber wirklich nicht schön anzuschauen. MfG Editiert von MatthiasW: Code zum Testen der Größe von Objekten hinzugefügt Last edited: 2011-07-15 17:26:09 +0200 (CEST) perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
|