在软件设计中,效率就是一切。你的代码的效率越高,它就运行得越快,就能更迅速地响应用户的命令。效率低下,缓慢的代码通常需要进行检查、调整,使它运行得更快。但是所有这些只有在“计时设备”存在的情况下才有可能,“计时设备”可测量某一特定的代码块运行的快慢,为开发人员提供准确的读数,以便于进行代码调整。
在本文中,我们通过建立一个交互式的工具来测量执行某一代码块所需的时间,为Perl代码计时(基准)提供一种轻松的方法。此工具应用perl 的Benchmark.pm模块多次运行一段代码,为每次的运行时间计时并返回所花的平均时间。当你调整代码时,就可以用这个工具来计时,看看代码运行得更快还是更慢。
注意:Benchmark.pm模块与最新版的perl捆绑发行。但是,如果你没有此模块,你可以在perl提示符下运行下列命令来下载并安装此模块:
perl> perl -MCPAN -e "install Benchmark"
脚本
通过创建以下perl脚本来开始:
表A
#!/usr/bin/perl
# import Benchmark module
use Benchmark;
# ask for number of runs
print "Enter number of code runs: ";
$runs = <STDIN>;
chomp ($runs);
# allow carriage returns within code
# by altering the EOL indicator
$/ = "#END";
# ask for code block
print "Enter code block (end with #END): ";
$code = <STDIN>;
chomp($code);
# test code and display run time report
print " ...Testing... ";
timethis($runs, $code);
此脚本要求用户输入两个项目:测试代码的次数,以及实际测试的代码块。一旦输入了这些值,Benchmark模块的timethis()函数即会按所需的次数反复运行此代码,并返回一个所花时间的报告。
这段代码有一个有趣的地方,就是对perl的输入记录分离符号的修改,以使其支持多行代码块。正常情况下,perl使用回车来标志用户输入终止,但是由于代码块通常都有多行代码,所以我们将它修改为特殊字符串#END来标志代码块的终止。
下面是一个上述工具运行的实例。样本代码用来计算前100个数字的平方根,并执行5000次。
表B:
Enter number of code runs:
5000
Enter code block (end with #END):
for ($i=1; $i<=100;$i++) {
牋?$res = sqrt($i);
}
#END
…测试…
timethis 5000
:?5 wallclocksecs ( 4.56 usr +?0.00 sys =?4.56 CPU) @ 1096.49/s (n=5000)
由timethis()函数产生的报告有两个构成部分:CPU秒数,即perl运行此代码N次所花时间,以及每秒数据,即每秒钟内代码运行了多少次。明显地,秒值越大,代码运行越快。
在上面的例子中,很明显,perl只用了不到5秒的时间就运行代码5000次。换句话说,perl每秒钟可成功运行此代码块1096次。如果你感兴趣的话,你还可应用此数据来执行更特殊的计算。例如,计算运行一个单独的代码所花的毫秒数。
对总是希望从他们的代码中获取最大性能的开发者而言,这样的工具会十分有用。代码优化以后,此工具可对它进行检测,看它到底运行得更快还是更慢。在每秒内运行的次数越多,代码的效率就更高。
责任编辑:张琎