代码之家  ›  专栏  ›  技术社区  ›  Ryan Detzel

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

  •  8
  • Ryan Detzel  · 技术社区  · 16 年前

    我一直在想这件事。我有一个习惯总是加上

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

    我写的每一个剧本的开头。如果我不使用转储函数,这会增加开销吗?另外,在大多数情况下,Data::Dumper是在另一个包中调用的,但我需要它在这个包中,所以我再次包含它。在这种情况下,它是否会产生额外的开销?

    6 回复  |  直到 16 年前
        1
  •  10
  •   Axeman maxelost    16 年前

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

    它不会增加开销的唯一方法是如果模块期望 use require . (当然, 而且 除了电脑,什么都有 进口 常规,但这就是为什么我从 -d模块。它“期望”的只是一个简单的问题 要求 .)

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

        2
  •  9
  •   Chas. Owens    16 年前

    Perl必须在 Dumper.pm

        3
  •  4
  •   Sinan Ünür    16 年前

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

     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)中,启动时间很重要,而在长时间运行的脚本和脚本中,内存占用也很重要。

        4
  •  1
  •   Alex Brown    16 年前

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

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

        5
  •  1
  •   Hynek -Pichi- Vychodil Paulo Suassuna    16 年前

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

    use Data::Dumper;
    

    几乎完全等同于:

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

    use Data::Dumper ();
    

    你不能打电话 Dumper() 但你必须使用 Data::Dumper::Dumper() . 我更喜欢使用 Data::Dumper->Dump([vars], [names]) 这给我带来了我更喜欢的输出。

        6
  •  0
  •   Ether    16 年前

    这并不是您所要求的,但我发现依赖Data::Dumper是一个值得打破的支柱和习惯。由于perl遵循假定其他代码是友好的而不是恶意的原则,因此程序员很容易转储不透明对象以发现其内部是如何存储的,然后直接访问这些内部,而不是使用提供的接口。Data::Dumper是创建Inside-Out对象的原因之一,它使敏锐但不耐烦的程序员更难/不可能在内部搜索。