Profile Perl script with Devel::DProf

最近更新了一下feedman,使其可以打印每个feed最近更新的时间,然而运行的时候发现print.pl明显比cache.pl要耗费CPU资源,担心由于dreamhost的CPU时间限制而不能上线,于是便想做个profile看有没有优化的余地。

Perl有三个module可以做profile,分别是:

我使用了第一个,如下:

$ perl -d:DProf print.pl
$ dprofpp
Total Elapsed Time = 79.65801 Seconds
 User+System Time = 75.44801 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
48.8   36.81 36.815 418482   0.0000 0.0000  XML::Parser::Expat::eq_name
29.7   22.46 59.279 116011   0.0000 0.0001  XML::Parser::Expat::within_element
17.7   13.41 80.911 254813   0.0001 0.0003  XML::RSS::handle_char
4.18   3.154  4.948 610015   0.0000 0.0000  XML::Parser::Expat::generate_ns_name
3.85   2.903  2.903 527420   0.0000 0.0000  XML::Parser::Expat::current_element
3.27   2.469 85.910    153   0.0161 0.5615  XML::Parser::Expat::ParseString
3.13   2.360  2.360 309740   0.0000 0.0000  XML::Parser::Expat::namespace
2.38   1.794  1.794 345778   0.0000 0.0000  XML::Parser::Expat::GenerateNSName
1.49   1.123  2.080   1402   0.0008 0.0015  DateTime::new
0.79   0.597  0.610   5494   0.0001 0.0001  Params::Validate::_validate
0.67   0.509  2.503  24127   0.0000 0.0001  XML::RSS::handle_start
0.28   0.214 90.228    223   0.0010 0.4046  main::get_latest_update_date
0.26   0.194  0.433   2324   0.0001 0.0002  DateTime::_compare
0.22   0.169 86.556    205   0.0008 0.4222  XML::Feed::parse
0.16   0.119  0.177   1085   0.0001 0.0002  DateTime::Format::Mail::_parse_loose

可以看出时间都用在解析xml文件上了,google了一把发现XML::Parser已经是最快的了,没法子,只好到wiki.dreamhost.com上去看CPU时间限制的具体描述,原来每人每天不能超过60分钟,我想这对我来说足够了,至少可以先试试,反正也不会关站,不行再撤吧。

list Perl core modules with Module::CoreList

Core Modules就是安装Perl时缺省安装的那些。既然下定决心每个月至少读2个Module的源代码,那总要先知道都有那些Core Modules吧。

最简单的办法就是打开文件夹看看,可惜这个方法对我无效,因为我装Perl的机器上肯定早就密密麻麻布满了很多我会用到的Module。幸好,还有Module::CoreList

更让人省事的是该Module里还带有一个写好的脚本——corelist。使用-v选项,该程序会打印出它支持的Perl版本,然后使用-v选项加上特定的版本号就可以显示那个版本有哪些Core Modules了,比如想看5.009003版本:

$ corelist -v 5.009003

其实Module::CoreList以前也关注过,但是它的帮助写得不太明白,看完了还是不知道它能干什么,该怎么用。后来发现有这么个脚本,肯定要看看人家是怎么写的。除了Module::CoreList,它还用了Getopt::LongPod::UsageGetopt::Long我用过好多次了,可人家那种用法没见过;Pod::Usage是在写基金计算器的时候第一次接触,遂爱不释手,Perl程序员果然是懒惰的天才,或者说天才般的懒惰,居然将文档、帮助和注释合三为一。