顶部的“use ....”是否会增加Perl脚本的开销?

时间:2009-06-12 14:33:15

标签: performance perl module

我一直想知道这一点。我有一个习惯,就是总是添加

use strict;
use warnings;
use Data::Dumper;

到我写的每个脚本的顶部。如果我甚至不使用Dumper功能,这会增加开销吗?此外,在大多数情况下,Data :: Dumper之前在另一个包中被调用,但我需要在此包中,所以我再次包含它。在这种情况下会产生额外的开销吗?

6 个答案:

答案 0 :(得分:10)

如果他们有BEGIN块或import例程,那么是的,它总是会增加开销。此外,最终将执行任何主线代码,并且还将执行任何INITCHECKEND块。

它不会增加开销的唯一方法是模块预期use只不过是require。 (当然,require 运行除import例程之外的所有内容,但这就是我提到use - d模块中的视图的原因。它“期望”只是一个简单的require。)

如果您想保留该行,出于某种原因,只需将其注释掉即可。在开发中,可以使用不使用的模块。在质量保证或生产中,这是一个错误,IMO。

答案 1 :(得分:9)

Perl必须解析Dumper.pm中的代码,因此启动程序的速度会慢一些。这对性能来说通常是一个非常微不足道的打击。此外,任何不在函数或导入函数中的代码都将运行。这可能会对您的启动时间产生轻微影响。您还将消耗更多内存(代码的AST和代码构建的任何数据结构)。这不是你能做的最好的事情,但它远非最糟糕的事情。除非您的程序经常(每分钟多次),否则您不应该通过删除该行来注意速度的任何真正改善。

答案 2 :(得分:4)

每次使用都会在脚本启动之前消耗时间,并可能增加脚本的内存占用量。要测试开销,可以运行以下脚本:

 C:\Temp> cat zzz.pl
 #!/usr/bin/perl
 sleep 10;

 C:\Temp> timethis zzz.pl
 TimeThis :  Elapsed Time :  00:00:10.172

任务管理器中的内存占用量为2548K。

现在添加

 use Data::Dumper;

再次测试:

 TimeThis :  Elapsed Time :  00:00:10.266

这一次,内存占用量为3408K。因此,如果您使用的模块并未真正使用,则会浪费一些时间和一些内存。

启动时间在重复调用的脚本中很重要(如CGI),并且内存占用很重要,其中包括长时间运行的脚本和脚本。

答案 3 :(得分:1)

如果您的脚本被重复执行并且存在延迟或运行时限制,这可能很重要。

例如,如果它是每次呈现网页时分叉的进程,您可能希望通过删除未使用的模块来最小化在加载期间解析的代码量。

或者如果你在xargs的右侧运行perl。

还有其他方法可以消除Web服务器情况中的开销。

答案 4 :(得分:1)

如果你问你不介意的话。是的,它增加了一些开销。代码:

use Data::Dumper;

几乎完全等同于:

BEGIN {
  require Data::Dumper;
  Data::Dumper->import();
}

这意味着,在编译时,Data :: Dumper模块将被解析并执行正文,除非尚未完成。这意味着如果你有许多模块并且在每个模块中都使用Data :: Dumper,那么这种开销只会发生一次。检查已经完成的要求是非常快,真的非常快。第二行执行导入调用,并将导入安装到当前包名称空间(由调用者获取)。在使用的所有模块中都需要一些时间。如果你想避免使用:

use Data::Dumper ();

您无法拨打Dumper(),但必须使用Data::Dumper::Dumper()。我更喜欢使用Data::Dumper->Dump([vars], [names])来为我带来更多的输出。

答案 5 :(得分:0)

这不是你所要求的,但我发现依靠Data :: Dumper是一个拐杖和一个值得打破的习惯。由于perl遵循的原则是假设其他代码是友好的而不是恶意的,因此对于程序员来说,Data :: Dump是一个非常诱人的对象来发现它的内部存储方式,然后直接访问这些内部,而不是使用提供接口。 Data :: Dumper是Inside-Out对象创建的原因之一 - 让敏锐但不耐烦的程序员更难/不可能通过内部构件进行嗅探。