2014-01-23 225 views
3

我剛剛閱讀了Gabor Szabo的文章this,他指出Devel :: Size報告說簡單的sub {}據報道需要8,516字節的空間。這個報告的大小是否正確?如果是這樣,爲什麼Perl需要爲單個空子例程分配這麼多空間?Devel ::尺寸報告的尺寸

回答

5
$ 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 

正如你所看到的,這不僅僅是測量子。似乎有一個指向子命名空間的指針。

+0

考慮到這一點,我傾向於不相信「Devel :: Size」所說的關於比普通數據結構更復雜的任何東西的大小。 (即使是那些我也會小心。) – duskwuff

3

Devel :: Size在測量像子程序這樣的複雜項目的大小時,沒有容易理解的規則。

Devel::SizeMe是Devel :: Size的實驗性叉,它使用引用計數來決定包含什麼,所以結果更容易理解。它還包括可視化數據內部結構的方法。

您可以找到Devel :: SizeMe的更多信息,包括幻燈片和截屏視頻的鏈接,here