从细节处提升Perl性能
本文向大家介绍一下如何从细节处提升Perl性能,主要包括变量和常量,循环,数据结构,数组字符串化等细节,希望本文的介绍能让你有所收获。
从细节处提升Perl性能
下面所写的各点都是我从其他地方找过来了。整理一下希望对各位有所帮助。
变量和常量
1,提升Perl性能时尽量减少数学表达式的计算,如:
$day=24*60*60;#不好
$day=86400;#better
2,使用vec函数而不是变量来存放非常小的数字。
1,如果输出里没有变量需要内插,使用单引号'而不是双引号".因为双引号会强制Perl检查可能插入的信息
2,多段输出时用,而不是.。因为连接操作符.会首先将字符串连接在一起,然后将其作为一个参数打印
避免没必要的引号
提升Perl性能时没有绝对必要不要使用引号:
my$copy="$large_string";
上述会$large_string做两次拷贝(一是拷贝到$copy另一次是引号内插),反之
my$copy=$large_string;
只做一次拷贝。
数组字符串化
同样摘自FAQ3.16
对于大数组字符串化:
{ local$,="\n"; print@big_array; } 比下面两样都更节省内存 printjoin"\n",@big_array; #or { local$"="\n"; print"@big_array"; }
引用\
提升Perl性能时如果使用大型数组或hash表,并使用它们作为函数的参数,那么应该使用它们的一个引用,而不应该直接使用它们。通过使用引用,可以告诉函数指向信息的指针。如果不使用引用,就需要将整个数组或hash表复制到该函数的调用栈中,然后在函数中再次对其进行复制。引用还可以节省内存(这可以减少足迹和管理的负载),并简化您的编程。
循环
尽早在循环内放置条件语句,以使Perl不执行无用的语句。如
while(){
chomp;
nextif/^#/;
next可以放在chomp上面。
有选择性地使用map和grep
因为map和grep是使用LIST列表参数,所以这么做
@wanted=grep{/pattern/};
会一次性读入整个文件。对于大文件来说,使用循环会更好一点:
while(){
push(@wanted,$_)if/pattern/;
}
正则表达式
pack/unpack>regexp>substr
删除字符串中的字符时用tr///d来代替s///g
在正则表达式的外面使用“or”或“||”操作。
$found=if/one/||/two/;#better
$found=if/one|two/;#useabovetoreplace
如果字符串很长,正则表达式很复杂,可以使用study来加快速度
数据结构
Tie::SubstrHash对于某些类型的数据结构会有所帮助
=pod
提升Perl性能时如果您用了一大块pod来描述你的代码,那么请尽量不要将其放在文件的上面或中间部分。虽然perl分析器能很快的跳过pod,但是这不是魔法,它还是需要一点时间的。它还是需要从磁盘中读入它,并且读入的目的仅仅是忽略它。将所有的pod放到__END__后面,那样Perl编译器就不会去注意它。
但是将pod与相关代码放在一起或许是种好习惯。
warnings/strict
强烈建议编程和调试时开启,而在代码发布时去掉它们。