[Perl]Benchmark 做 Perl 的性能测试
转载本站文章请注明,转载自:扶凯[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 的调试和性能测试