使用DProf分析Perl,总耗用时间较长

时间:2013-07-10 21:44:54

标签: perl optimization profiling

我刚用DProf描述了我的代码:

Total Elapsed Time = 9.969922 Seconds
  User+System Time = 0.049922 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 40.0   0.020  0.020      2   0.0100 0.0100  main::difference
 40.0   0.020  0.020      3   0.0067 0.0066  main::BEGIN
 0.00       - -0.000      1        -      -  DynaLoader::dl_install_xsub
 0.00       - -0.000      1        -      -  Data::Dumper::bootstrap
 0.00       - -0.000      1        -      -  strict::import
 0.00       - -0.000      1        -      -  warnings::BEGIN
 0.00       - -0.000      1        -      -  warnings::import
 0.00       - -0.000      1        -      -  bytes::import
 0.00       - -0.000      1        -      -  strict::bits
 0.00       - -0.000      1        -      -  DynaLoader::dl_load_file
 0.00       - -0.000      1        -      -  DynaLoader::dl_undef_symbols
 0.00       - -0.000      1        -      -  DynaLoader::dl_find_symbol
 0.00       - -0.000      1        -      -  overload::BEGIN
 0.00       - -0.000      2        -      -  warnings::register::mkMask
 0.00       - -0.000      2        -      -  Exporter::import

所以我的difference子程序占用了大约40%的时间,BEGIN占用了另外40%的子程序。我不太确定其他9.8秒发生了什么。任何人都可以向我解释Perl在剩下的时间里做了什么吗?

基本上,我的代码接受两个数组,执行设置差异,并写入文件。文件不是太大(23,028个字符)。这是我的difference子程序,如果你很好奇:

sub difference {
    my @array1 = @{$_[0]};
    my @array2 = @{$_[1]};

    my %in_array1 = map {$_ => 1} @array1;
    my @diff  = grep {not $in_array1{$_}} @array2;
    return @diff;
}

2 个答案:

答案 0 :(得分:1)

Devel :: DProf已弃用,所以我不知道它是否有效。

使用Devel :: NYTProf(https://metacpan.org/module/Devel::NYTProf),这是一个非常有用的Perl分析器。

答案 1 :(得分:1)

Perl很可能只是在等待。要么是睡眠(),要么脚本正在等待磁盘或网络输入/输出或外部命令(系统/执行/反引号)或类似的东西。您可以使用以下脚本轻松地重现它:

#!/usr/bin/perl
x();
sub x {
    sleep 10;
}
我系统上的

dprofpp输出是:

Total Elapsed Time = 9.999998 Seconds
  User+System Time =        0 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 0.00       - -0.000      1        -      -  main::x