我正在尝试了解数据结构的内存消耗,并且不确定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内存分配的理解错了?此外,是否有更好的模块来分析复杂的数据结构?
答案 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
当然,我不知道Bar
和Foo
个对象的内部,现在我只有perl
5.10.1
和Devel::Size {{ 1}}在Windows上。
答案 1 :(得分:0)
在创建新Bar
时,查看是否使用标量参考而不是标量本身可以解决此问题:
push @list, Bar->new({ foo => \$shared_obj });