用Devel::SmallProf测量Perl函数的执行时间

资料来源

用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 ================