Perl程序性能调试之dprofpp

要调试一个程序的性能,profiling是其中一个很有效的方式。

Perl的安装包自带有一个模块Devel::DProf用于性能调试。

Quick Start

运行程序,通过-d:DProf选项启用profiling.

$ perl -d:DProf test.pl

程序执行完毕后,profiling数据存储在当前目录下的tmon.out文件中。

运行程序dprofpp来解析文件tmon.out并输出报告。

$ dprofpp -u
Total Elapsed Time =    1.67 Seconds
User Time =    0.61 Seconds
Exclusive Times
%Time Seconds     #Calls sec/call Name
 52.4   0.320          2   0.1600 main::foo
 45.9   0.280        200   0.0014 main::bar
 0.00   0.000          1   0.0000 DynaLoader::import
 0.00   0.000          1   0.0000 main::baz

然后就是解读报告来找出性能的瓶颈,然后进行针对性的优化。

dprofpp 使用概要

dprofpp程序的默认输出是按照函数的exclusive time排序,输出用时最多的前15个函数。

  • 选项-I:输出 inclusive time,默认的是exclusive time
  • 选项-O 15:输出指定数目的记录,默认值是15
  • 选项-l:按照函数的调用次数排序
  • 选项-v:按照函数的平均执行时间排序
  • 选项-t:输出各函数的调用顺序

tmon.out 的文件格式

文件tmon.out的内容的格式如下

#fOrTyTwO
$hz=100;
$XS_VERSION='DProf 19970606';
# All values are given in HZ
$rrun_utime=2; $rrun_stime=0; $rrun_rtime=7
PART2
+ 26 28 566822884 DynaLoader::import
- 26 28 566822884 DynaLoader::import
+ 27 28 566822885 main::bar
- 27 28 566822886 main::bar
+ 27 28 566822886 main::baz
+ 27 28 566822887 main::bar
- 27 28 566822888 main::bar
... ...
  • + 表示函数开始执行
  • - 表示函数结束执行
  • 每行对应的数字分为是 user time, system time, clock time,单位是ticks
  • tick的大小可以由第二行$hz=100得出。

更强大的Devel::NYTProf

目前Devel::DProf已经不被建议使用,而是由更新更强大的Devel::NYTProf所取代。

虽然如此,考虑到Devel::NYTProf也许并没有预先安装你的开发环境中,很多时候还是值得先拿Devel::DProf来试一试。很多时候,也基本够用。

网络资源

  • 要调试一个程序的性能,profiling是其中一个很有效的方式。

Perl的安装包自带有一个模块Devel::DProf用于性能调试。

Quick Start

运行程序,通过-d:DProf选项启用profiling.

$ perl -d:DProf test.pl

程序执行完毕后,profiling数据存储在当前目录下的tmon.out文件中。

运行程序dprofpp来解析文件tmon.out并输出报告。

$ dprofpp -u
Total Elapsed Time =    1.67 Seconds
User Time =    0.61 Seconds
Exclusive Times
%Time Seconds     #Calls sec/call Name
 52.4   0.320          2   0.1600 main::foo
 45.9   0.280        200   0.0014 main::bar
 0.00   0.000          1   0.0000 DynaLoader::import
 0.00   0.000          1   0.0000 main::baz

然后就是解读报告来找出性能的瓶颈,然后进行针对性的优化。

dprofpp 使用概要

dprofpp程序的默认输出是按照函数的exclusive time排序,输出用时最多的前15个函数。

  • 选项-I:输出 inclusive time,默认的是exclusive time
  • 选项-O 15:输出指定数目的记录,默认值是15
  • 选项-l:按照函数的调用次数排序
  • 选项-v:按照函数的平均执行时间排序
  • 选项-t:输出各函数的调用顺序

tmon.out 的文件格式

文件tmon.out的内容的格式如下

#fOrTyTwO
$hz=100;
$XS_VERSION='DProf 19970606';
# All values are given in HZ
$rrun_utime=2; $rrun_stime=0; $rrun_rtime=7
PART2
+ 26 28 566822884 DynaLoader::import
- 26 28 566822884 DynaLoader::import
+ 27 28 566822885 main::bar
- 27 28 566822886 main::bar
+ 27 28 566822886 main::baz
+ 27 28 566822887 main::bar
- 27 28 566822888 main::bar
... ...
  • + 表示函数开始执行
  • - 表示函数结束执行
  • 每行对应的数字分为是 user time, system time, clock time,单位是ticks
  • tick的大小可以由第二行$hz=100得出。

更强大的Devel::NYTProf

目前Devel::DProf已经不被建议使用,而是由更新更强大的Devel::NYTProf所取代。

虽然如此,考虑到Devel::NYTProf也许并没有预先安装你的开发环境中,很多时候还是值得先拿Devel::DProf来试一试。很多时候,也基本够用。

网络资源

  • http://perldoc.perl.org/dprofpp.html
  • http://perldoc.perl.org/Devel/DProf.html