2011-07-15T11:39:52
pq2011-07-15T07:38:50
rostidanke, jow, leider sind die Daten kurzzeitig mal doppelt im RAM,
falsch. der code nimmt von @old weg und fügt zu @new hinzu. es sind immer nur 3 elemente doppelt im speicher.
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:
more (7.2kb)
liefert:
more (1.0kb)
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:
$data[$_] = [@data[$_*3..$_*3+2]] for 0..$#data/3;
$#data = $#data/3;
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"'