0

我刚刚用 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;
}
4

2 回答 2

1

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

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

于 2013-07-10T21:50:15.493 回答
1

Perl 很可能只是在等待。要么有 sleep() 要么脚本正在等待磁盘或网络输入/输出或外部命令(system/exec/backticks)或类似的东西。您可以使用以下脚本非常轻松地重现它:

#!/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
于 2013-07-11T07:53:30.023 回答