【发布时间】:2014-02-13 08:14:57
【问题描述】:
我刚刚阅读 Gabor Szabo 的 this 文章,他指出,Devel::Size 报告一个简单的 sub {} 报告需要 8,516 字节的空间。这个报告的大小是否正确?如果是这样,为什么 Perl 需要为单个空子例程分配这么多空间?
【问题讨论】:
标签: c perl subroutine internals
我刚刚阅读 Gabor Szabo 的 this 文章,他指出,Devel::Size 报告一个简单的 sub {} 报告需要 8,516 字节的空间。这个报告的大小是否正确?如果是这样,为什么 Perl 需要为单个空子例程分配这么多空间?
【问题讨论】:
标签: c perl subroutine internals
Devel::Size 没有易于理解的规则来说明在测量子例程等复杂项目的大小时要包含的内容。
Devel::SizeMe 是 Devel::Size 的一个实验性分支,它使用引用计数来决定要包含的内容,因此结果更容易理解。它还包括可视化数据内部结构的方法。
您可以找到更多关于 Devel::SizeMe 的信息,包括幻灯片和截屏链接,here。
【讨论】:
$ perl -MDevel::Size=total_size -E'
my $s = "x" x 100_000;
my $x = \$s;
my $y = \$s;
say total_size($x);
say total_size($y);
'
100048
100048
这是否意味着$x 和$y 的总大小为200KB?不。这里的想法相同。
这不是 sub 的大小,而是引用的大小,以及它直接和间接引用的所有内容。
$ perl -MDevel::Size=total_size -E'
sub f { } say total_size(\&f);
${"xxx"}=1; say total_size(\&f);
${"yyy"}=1; say total_size(\&f);
'
5847
5908
5969
如您所见,这不仅仅是对潜艇的测量。似乎有一个指向子名称空间的指针。
【讨论】:
Devel::Size 所说的比普通数据结构更复杂的东西的大小。 (即使是那些我也会小心的。)