3

所以这似乎是一个愚蠢的问题,但我正在构建一个内存资源非常有限的应用程序,所以我需要尽可能谨慎地使用内存。所以我的问题是,以下哪个更节省内存?

while(<LINKS_FILE>) {
    my $extor = HTML::SimpleLinkExtor->new($resp->base); #$resp from above somewhere
    $extor->parse($_);
    my @links = $extor->links;
    for my $link (@links) { print "$link\n" }
}

或者

my $extor = HTML::SimpleLinkExtor->new($resp->base); #$resp from above somewhere
while(<LINKS_FILE>) {
    $extor->parse($_);
    my @links = $extor->links;
    for my $link (@links) { print "$link\n" }
    $extor->clear_links;
}

因此,第一次它每次都会创建一个新的 HTML::SimleLinkExtor 对象,而第二次它只是重置同一个对象以再次使用。所以在我看来,第二个内存效率更高,但老实说,我真的不知道 perl 将内存释放回操作系统有多好,或者它是否会保留一些内存HTML::SimpleLinkExtor 对象即使超出范围也是如此。谢谢您的帮助!

4

1 回答 1

1

我不倾向于花时间进行分析,但如果我遇到你的情况,我会先尝试HTML::LinkExtor。如果您提供回调,它不会保存在内部找到的链接,从而减少应用程序的占用空间。然后,您可以决定是否存储链接,或者写入外部文件,以将内存使用降至最低:

use HTML::LinkExtor;
my $parser = HTML::LinkExtor->new(sub {
     my($tag, %links) = @_;
     print "$tag @{[%links]}\n";
});

$parser->parse_file("index.html");
于 2012-07-08T18:37:21.443 回答