Devel :: Sizeは共有参照を正しく扱いますか?

私はデータ構造のメモリ消費量を知ろうとしていますが、 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は単一の Foo オブジェクトにメモリを割り当て、各 Bar オブジェクトは Foo へのハッシュ参照に必要なメモリのみを必要とします。 。

私の印象は、 Devel :: Size はメモリ使用量を正しく追加しないということです。ハッシュ・リファレンスのサイズの10倍ではなく、 Foo Foo のサイズの1倍。

誰もこの行動を確認できますか? Devel :: Size は間違っていますか、Perlのメモリ割り当てが間違っていると思いますか?また、複雑なデータ構造をプロファイリングするためのより良いモジュールがありますか?

2

2 答え

私が見ていることは、私が期待しているものと互換性があります:

#!/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。

1
追加された

この問題を解決する新しい Bar の作成時にscalar-refを使用するかスカラー自体を使用しないかを確認してください:

push @list, Bar->new({ foo => \$shared_obj });
0
追加された
私の設定に今インストールされている Devel :: Size がありません。これを今すぐテストすることはできません
追加された 著者 Zaid,