從細(xì)節(jié)處提升Perl性能
本文向大家介紹一下如何從細(xì)節(jié)處提升Perl性能,主要包括變量和常量,循環(huán),數(shù)據(jù)結(jié)構(gòu),數(shù)組字符串化等細(xì)節(jié),希望本文的介紹能讓你有所收獲。
從細(xì)節(jié)處提升Perl性能
下面所寫的各點都是我從其他地方找過來了。整理一下希望對各位有所幫助。
變量和常量
1,提升Perl性能時盡量減少數(shù)學(xué)表達(dá)式的計算,如:
$day=24*60*60;#不好
$day=86400;#better
2,使用vec函數(shù)而不是變量來存放非常小的數(shù)字。
1,如果輸出里沒有變量需要內(nèi)插,使用單引號'而不是雙引號".因為雙引號會強制Perl檢查可能插入的信息
2,多段輸出時用,而不是.。因為連接操作符.會首先將字符串連接在一起,然后將其作為一個參數(shù)打印
避免沒必要的引號
提升Perl性能時沒有絕對必要不要使用引號:
my$copy="$large_string";
上述會$large_string做兩次拷貝(一是拷貝到$copy另一次是引號內(nèi)插),反之
my$copy=$large_string;
只做一次拷貝。
數(shù)組字符串化
同樣摘自FAQ3.16
對于大數(shù)組字符串化:
- {
- local$,="\n";
- print@big_array;
- }
- 比下面兩樣都更節(jié)省內(nèi)存
- printjoin"\n",@big_array;
- #or
- {
- local$"="\n";
- print"@big_array";
- }
引用\
提升Perl性能時如果使用大型數(shù)組或hash表,并使用它們作為函數(shù)的參數(shù),那么應(yīng)該使用它們的一個引用,而不應(yīng)該直接使用它們。通過使用引用,可以告訴函數(shù)指向信息的指針。如果不使用引用,就需要將整個數(shù)組或hash表復(fù)制到該函數(shù)的調(diào)用棧中,然后在函數(shù)中再次對其進(jìn)行復(fù)制。引用還可以節(jié)省內(nèi)存(這可以減少足跡和管理的負(fù)載),并簡化您的編程。
循環(huán)
盡早在循環(huán)內(nèi)放置條件語句,以使Perl不執(zhí)行無用的語句。如
while(){
chomp;
nextif/^#/;
next可以放在chomp上面。
有選擇性地使用map和grep
因為map和grep是使用LIST列表參數(shù),所以這么做
@wanted=grep{/pattern/};
會一次性讀入整個文件。對于大文件來說,使用循環(huán)會更好一點:
while(){
push(@wanted,$_)if/pattern/;
}
正則表達(dá)式
pack/unpack>regexp>substr
刪除字符串中的字符時用tr///d來代替s///g
在正則表達(dá)式的外面使用“or”或“||”操作。
$found=if/one/||/two/;#better
$found=if/one|two/;#useabovetoreplace
如果字符串很長,正則表達(dá)式很復(fù)雜,可以使用study來加快速度
數(shù)據(jù)結(jié)構(gòu)
Tie::SubstrHash對于某些類型的數(shù)據(jù)結(jié)構(gòu)會有所幫助
=pod
提升Perl性能時如果您用了一大塊pod來描述你的代碼,那么請盡量不要將其放在文件的上面或中間部分。雖然perl分析器能很快的跳過pod,但是這不是魔法,它還是需要一點時間的。它還是需要從磁盤中讀入它,并且讀入的目的僅僅是忽略它。將所有的pod放到__END__后面,那樣Perl編譯器就不會去注意它。
但是將pod與相關(guān)代碼放在一起或許是種好習(xí)慣。
warnings/strict
強烈建議編程和調(diào)試時開啟,而在代碼發(fā)布時去掉它們。
Final
***強烈建議各位閱讀參考里的“Whenperlisnotquitefastenough”。
【編輯推薦】