Правильно ли обрабатывает Devel :: Size общие ссылки? - PullRequest
2 голосов
/ 28 октября 2011

Я пытаюсь получить представление о потреблении памяти структурой данных и не уверен, правильно ли 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 неправильно складывает использование памяти: он добавляет 10-кратный размер Foo, а не 10-кратный размер ссылки на хэш и 1-кратный размер Foo.

Кто-нибудь может подтвердить это поведение?Является ли Devel::Size неправильным или мое понимание распределения памяти в Perl неверно?Кроме того, есть ли лучший модуль для профилирования сложных структур данных?

Ответы [ 2 ]

1 голос
/ 28 октября 2011

То, что я вижу, совместимо с тем, что я ожидаю:

#!/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 0.71 в Windows .

0 голосов
/ 28 октября 2011

Проверьте, решает ли эта проблема использование скаляр-ссылки, а не самого скаляра при создании новых Bar s:

push @list, Bar->new({ foo => \$shared_obj });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...