#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
установленной установки .. не могу проверить это прямо сейчас