从细节处提升Perl性能

从细节处提升Perl性能

下面所写的各点都是我从其他地方找过来了。整理一下希望对各位有所帮助。

变量和常量

1,提升Perl性能时尽量减少数学表达式的计算,如:
$day=24*60*60;#不好
$day=86400;#better

2,使用vec函数而不是变量来存放非常小的数字。

print

1,如果输出里没有变量需要内插,使用单引号'而不是双引号".因为双引号会强制Perl检查可能插入的信息
2,多段输出时用,而不是.。因为连接操作符.会首先将字符串连接在一起,然后将其作为一个参数打印

避免没必要的引号

提升Perl性能时没有绝对必要不要使用引号:
my$copy="$large_string";
上述会$large_string做两次拷贝(一是拷贝到$copy另一次是引号内插),反之
my$copy=$large_string;
只做一次拷贝。

数组字符串化

同样摘自FAQ3.16
对于大数组字符串化:
 

 
 
  
  
  
  
  1. {  
  2. local$,="\n";  
  3. print@big_array;  
  4. }  
  5. 比下面两样都更节省内存  
  6. printjoin"\n",@big_array;  
  7.  
  8. #or  
  9. {  
  10. local$"="\n";  
  11. print"@big_array";  
  12. }  
  13.  

引用\
提升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
强烈建议编程和调试时开启,而在代码发布时去掉它们。

Final

最后强烈建议各位阅读参考里的“Whenperlisnotquitefastenough”。

你可能感兴趣的:(从细节处提升Perl性能)