Tipps und Tricks zu Perl und CPAN-Modulen

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).


Kommentar abgeben