Perl 的性能测试

 

[Perl]Benchmark 做 Perl 的性能测试

Feb 4th, 2011

转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]

本文链接: http://www.php-oa.com/2011/02/04/benchmark-perl.html

当我们深入使用 Perl 时,慢慢的写一些重要的应用,又需要占用大量 CPU 时, 我们开始大量的关注程序的性能.因为性能可能会要决定你这个程序的生死.
他是否能在公司的机器上跑,还是沦落到需要被 C 替换的命运,所以这些,我们在程序写完时,对内部结构做一些性能调整就非常有必要了.这时需要使用详细的了解每个部分所占用的 CPU .刚好 Perl 本身有很多不错的模块来帮大家做性能的评定.不然你写完上线才发现性能是如此的糟糕可不行.

先讲最最麻烦的 Benchmark.这是大家最麻烦,也最细的一个性能测试的软件 了.基本有几个基本的子函数的功能我们需要,一个是 timethis 来看基本的性能,如果有几个要对比,可以使用 timethese,cmpthese 是对比一些东西

 

Benchmark 中的 timethis 功能

基本函数,块的性能对比,这个可以使用 sub 和 eval 之类来做性能的测试。可以看下面的例子,这个 timethis 的第一个参数是运行的次数,如果是负数,就变成了使用的时间,所以我们会更加常用时间来测试(默认为 3 秒).第二个参数是代码块(子函数,eval),比如下面的例子我使用的是测试 foreach 运行 4 秒所占用的 CPU .

?
#!/usr/bin/perl
use strict;
use Benchmark;
timethis (-4, sub { foreach (1..100){} });

timethis 功能的输出时,主要关注后面的二个部分,可以见到后面的数字 (n=802806) 是指在这 4 秒,对后面这个代码块(子函数,eval)运行的次数,也就是 foreach 1..100 可以做 802806 次。 195806.34/s 是指每秒可以运行 195806.34 次。

?
timethis for 4: 4 wallclock secs ( 4.10 usr + 0.00 sys = 4.10 CPU) @ 195806.34/s (n=802806)

 

 

Benchmark 中的 timethese 功能

上面我们可以见到 timethis 只对放一个代码块,这个地方可以放二个以上的代码块来对比.这样可以方便我们对比多种写法实现同样的功能时,性能最好是其中什么写法。下面是我的示例代码. timethis 参数也是一样,第一个参数是时间,但这个时间是指每个代码块所使用的时间.下面然后我接了二个子函数的块,每个块给了一个名字,方便输出时分析,一个叫 directly 一个叫 indirectly.

?
#!/usr/bin/perl
use strict;
use Benchmark;
  
timethese (
         -5,
         {
         directly    => sub { my $i ; for (1 .. 100) { $i += $_ } },
         indirectly  => sub { my $i ; for (1 .. 100) { $i $_ + $i } },
         }
  );

下面是 timethese 的输出,我们可以见到,直接使用 $i += $_ 和 $i = $_ + $i;时,是没有性能分别的。基本上非常非常接近.下面的结果也和上面的 thmethis 是一样的.

?
Benchmark: running directly, indirectly for at least 5 CPU seconds...
directly: 5 wallclock secs ( 5.25 usr + 0.00 sys = 5.25 CPU) @ 73769.71/s (n=387291)
indirectly: 6 wallclock secs ( 5.22 usr + 0.00 sys = 5.22 CPU) @ 74193.68/s (n=387291)

 

 

Benchmark 中的 cmpthese 功能

上面的 timethese 是一个加强版的 thmethis 分别是一个只能运行一个块,一个可以多个,但当多个代码块时,我们很难对比输出的结果,这时我们可以看看
cmpthese 的这个函数.
这个基本和上面的程序一样,只变化一个函数就行了.如下,参数什么的也一样.

?
#!/usr/bin/perl
use strict;
use Benchmark qw(:all);
  
cmpthese (
         -5,
         {
         directly    => sub { my $i ; for (1 .. 100) { $i += $_ } },
         indirectly  => sub { my $i ; for (1 .. 100) { $i $_ + $i } },
         }
  );

容易使用吧.输出也很容易直接就是参数的结果,下面比较容易看出结果吧。这时使用的是 % 来做输出更加方便对比

?
               Rate indirectly   directly
indirectly 74041/s         --        -5%
directly   77727/s         5%         --

 

有关一些其它的测试软件(Devel::DProf,Devel::SmallProf, Devel::FastProf),可以看我原来的文章: perl 的调试和性能测试

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值