Devel :: Size是否正确处理共享引用?

时间:2011-10-28 09:51:50

标签: perl

我正在尝试了解数据结构的内存消耗,并且不确定Devel::Size是否正确处理共享引用。

这里有一个小数据结构来说明我的观点:

use Devel::Size qw(total_size);

my $shared_obj = Foo->new();
my @list = ();
for (1..10) {
  push @list, Bar->new({ foo => $shared_obj });
}
print "Memory usage: ", total_size(\@list), "\n";

Perl应该(AFAIK)为单个Foo对象分配内存,并且每个Bar对象只需要对Foo的哈希引用所需的内存。

我的印象是Devel::Size没有正确添加内存使用量:它增加了Foo大小的10倍,而不是散列引用大小的10倍和{{1}的大小1}}。

有人可以证实这种行为吗?是Foo错了,还是我对Perl内存分配的理解错了?此外,是否有更好的模块来分析复杂的数据结构?

2 个答案:

答案 0 :(得分:1)

我所看到的与我期望的相符:

#!/usr/bin/perl

package Foo;

use strict; use warnings;

sub new {
    my $class = shift;
    my $self = [ 1 .. 1_000 ];
    return bless $self => $class;
}

package Bar;

use strict; use warnings;

sub new {
    my $class = shift;
    my $self = shift;
    return bless $self => $class;
}

package main;

use strict; use warnings;

use Devel::Size qw(total_size);

my $shared_obj = Foo->new;

my @list = map Bar->new({foo => $shared_obj}), 1 .. 10;

print "Memory usage of \@list: ", total_size(\@list), "\n";
print "Memory usage of \$shared_obj: ", total_size([$shared_obj]), "\n";

输出:

Memory usage of @list: 22389
Memory usage of $shared_obj: 20196

当然,我不知道BarFoo个对象的内部,现在我只有perl 5.10.1Devel::Size {{ 1}}在Windows上。

答案 1 :(得分:0)

在创建新Bar时,查看是否使用标量参考而不是标量本身可以解决此问题:

push @list, Bar->new({ foo => \$shared_obj });