Array-Overhead mit Devel::Size bestimmen
Beitrag von Uwe am 24.12.2008 um 08:30 Uhr | 0 Kommentare
Perl's dynamische Arrays und Hashes sind eine feine Sache. Aber wenn man sie in großen Mengen verwendet, sollte man eins wissen: Sie brauchen viel Speicherplatz.
Am Beispiel von Holzwurm Bertolt möchte ich dies demonstrieren:
#!/usr/bin/perl use strict; use warnings; use Devel::Size qw(total_size); my $map = 'aaABbb'. 'a## #b'. 'a C b'. 'a#C##b'. 'aABbbb'. '##### '; my @map = [['a', 'a', 'A', 'B', 'b', 'b'], ['a', '#', '#', ' ', '#', 'b'], ['a', ' ', 'C', ' ', ' ', 'b'], ['a', '#', 'C', '#', '#', 'b'], ['a', 'A', 'B', 'b', 'b', 'b'], ['#', '#', '#', '#', '#', ' '], ]; printf("Skalar: %4d\n", total_size(\$map)); printf("Array: %4d\n", total_size(\@map));
Download: array-size.pl
Ausgabe:
Skalar: 88 Array: 3512
Die Darstellung des Zustandes als Skalar (String) benötigt 88 Bytes. Für ein Array-of-Arrays fallen gleich 3.512 Bytes an. Dies ist quasi das Vierzigfache!
Nun aber an jeder Stelle auf Arrays oder Hashes zu verzichten, wäre die falsche Schlußfolgerung. Aber wenn es darum geht, sich möglichst viele Zustände zu merken (wie bei einer Spielbaumsuche), dann sollte diese Repräsentation möglichst kompakt sein.
In eigener Sache
Dies wird mein letzter Post im Jahr 2008 sein. Ich wünsche meinen Lesern ein frohes Weihnachtsfest und einen guten Rutsch ins neue Jahr.
Mein im November gestecktes Ziel von fünf Beiträgen konnte ich sogar übertreffen. Ich hoffe, für den einen oder anderen war etwas interessantes dabei. Im neuen Jahr werde ich mehr über Mojo berichten und die bin-Serie fortführen. Ebenfalls in Planung ist ein anschauliches Beispiel fürs Profiling (inkl. XS-Implementierung).