Perl Best Practices

19.9. Memory

Don't optimize data structuresmeasure them.

Intuitions about the relative space efficiency of different data structures aren't very reliable, either. If you are concerned about the memory footprint of a data structure that you are using, the Devel::Size module makes it easy to see how heavy the burden actually is:

# This look-up table is handy, but seems to be too bloated... my %lookup = load_lookup_table($file);

# So let's look at how much memory it's using... use Devel::Size qw( size total_size ); use Perl6::Form; my $hash_mem = size(\%lookup);

# Storage overheads only my $total_mem = total_size(\%lookup);

# Overheads plus actual data my $data_mem = $total_mem - $hash_mem;

# Data only print form( 'hash alone: {>>>,>>>,>>} bytes', $hash_mem, 'data alone: {>>>,>>>,>>} bytes', $data_mem, '============================', 'total: {>>>,>>>,>>} bytes', $total_mem, );

That might print something like:

hash alone: 8,704,075 bytes data alone: 8,360,250 bytes ============================== total: 17,064,325 bytes

which indicates that storing your 8.36MB of data in a hash has incurred an overhead of an additional 8.70MB for buckets, hash tables, keys, and other internals.

The total_size( ) subroutine takes a reference to a variable and returns the total number of bytes of memory used by that variable. This includes both:

  • The memory that the variable uses for its own implementation. For example, the buckets that are needed to implement a hash, or the flag bits that are used inside every scalar.

  • The memory used by the data that the variable stores. For example, the space required for the keys and values in a hash, or for the value in a scalar.

The size( ) subroutine also takes a variable reference, but returns only the number of bytes that the variable uses for itself, excluding the memory required to store its data.

Категории