Правильно ли Devel::Size обрабатывает общие ссылки?

#perl

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

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

Ответ №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";
 

Вывод:

Использование памяти @list: 22389
Использование памяти в $ shared_obj: 20196

Конечно, я не знаю внутренностей Bar объектов Foo and, и сейчас у меня есть только perl 5.10.1 and Devel::Size 0.71 в Windows.

Ответ №2:

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

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

Комментарии:

1. У меня сейчас нет Devel::Size установленной установки .. не могу проверить это прямо сейчас