【问题标题】:Profiling Perl with DProf, with long Total elapsed times使用 DProf 分析 Perl,总运行时间长
【发布时间】:2013-07-10 21:44:53
【问题描述】:

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

【问题讨论】:

  • DProf 已经过时,并被Devel::NYTProf 取代:颜色编码、源映射、漂亮的向下钻取图形、语句级分析……这是分析器的天堂(除非你需要线程)。您为什么不使用该现代工具重新分析您的代码并查看 HTML 输出?
  • 你在什么平台上?

标签: perl optimization profiling


【解决方案1】:

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

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

【讨论】:

  • 我无法安装 Perl 模块,很遗憾我没有安装 NYTProf。有其他选择吗?
  • 我不知道替代方案,但是如果您可以使用 SSH 登录系统并且可以使用 C 编译器,则可以使用 cpanm 在您的空间中安装 NYTProf:curl -L http://cpanmin.us | perl -- -l extlib Devel::NYTProf 并且可以使用它perl -Mlib=extlib/lib/perl5 -d:NYTProf.
【解决方案2】:

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

【讨论】:

  • 我确实有一个反引号被执行了 3 次(在一个循环中)。有办法优化吗?
  • 好吧,你不必优化你的 perl 脚本,但是在反引号中调用的命令...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多