资料来源
用Devel::SmallProf测量Perl函数的执行时间
perl 的调试和性能测试
Perl 问题之万能指南
Devel::SmallProf是个很好用的模块,可以方便地测量出代码每一行的执行时间,以便进一步优化。
例如以下程序,文件名为test.pl。
1 2 3 4 5 6 7 | #!/usr/bin/perl my $str = "0"; for ( my $i = 0 ; $i < 100 ; $i++ ) { $str =~ s/d+/($&+1)/e; print $str. "n"; } |
该程序的功能是输出整数 1 到 100。当然实际写程序时可不要用这么低效率的方法。
安装 Devel::SmallProf 之后我们来测量一下它每一行代码的执行时间。
1 | perl -d:SmallProf test.pl |
执行之后会在当前目录下生成一个 smallprof.out 文件,其内容如下:
1 2 3 4 5 6 7 8 9 10 11 | ================ SmallProf version 2.02 ================ Profile of test.pl Page 1 ================================================================= count wall tm cpu time line 0 0.00000 0.00000 1:#!/usr/bin/perl 0 0.00000 0.00000 2: 1 0.00000 0.00000 3:my $str = "0"; 1 0.00000 0.00000 4:for ( my $i = 0 ; $i < 100 ; $i++ ) { 100 0.00032 0.00000 5: $str =~ s/d+/($&+1)/e; 100 0.00021 0.00000 6: print $str. "n"; 1 0.00000 0.00000 7:} |
前三列的数字分别为执行次数、消耗时间、消耗CPU时间。
如果你的程序使用 use 语句引用了其他模块,那么所有被引用的程序都将被分析,生成一个长长的报告。这时可以使用下面的命令来迅速找到耗时最长的命令。
1 | sort -k 2nr,2 smallprof.out | less |
结果如下:
1 2 3 4 5 6 7 8 9 10 11 | 100 0.00032 0.00000 5: $str =~ s/d+/($&+1)/e; 100 0.00021 0.00000 6: print $str. "n"; ================================================================= 0 0.00000 0.00000 1:#!/usr/bin/perl 0 0.00000 0.00000 2: 1 0.00000 0.00000 3:my $str = "0"; 1 0.00000 0.00000 4:for ( my $i = 0 ; $i < 100 ; $i++ ) { 1 0.00000 0.00000 7:} count wall tm cpu time line Profile of test.pl Page 1 ================ SmallProf version 2.02 ================ |