發新話題

從細節處提升Perl性能

從細節處提升Perl性能

Description
下面所寫的各點都是我從其他地方找過來了。整理一下希望對各位有所幫助。

Details
變量和常量
1, 盡量減少數學表達式的計算,如
$day = 24*60*60; # 不好
$day = 86400; # better
2, 使用vec函數而不是變量來存放非常小的數字。
print
1, 如果輸出裡沒有變量需要內插,使用單引號'而不是雙引號".因為雙引號會強制 Perl 檢查可能插入的信息
2, 多段輸出時用,而不是.。因為連接操作符.會首先將字符串連接在一起,然後將其作為一個參數打印

避免沒必要的引號
摘自 FAQ 3.16: How can I make my Perl program take less memory?
沒有絕對必要不要使用引號:
my $copy = "$large_string";上述會$large_string做兩次拷貝(一是拷貝到 $copy 另一次是引號內插),反之
my $copy = $large_string;只做一次拷貝。

數組字符串化
同樣摘自 FAQ 3.16
對於大數組字符串化:
{
    local $, = "\n";
    print @big_array;
}比下面兩樣都更節省內存
print join "\n", @big_array;

#or

{
    local $" = "\n";
    print "@big_array";
}引用\
如果使用大型數組或 hash 表,並使用它們作為函數的參數,那麼應該使用它們的一個引用,而不應該直接使用它們。通過使用引用,可以告訴函數指向信息的指針。如果不使用引用,就需要將整個數組或 hash 表複製到該函數的調用棧中,然後在函數中再次對其進行複製。引用還可以節省內存(這可以減少足跡和管理的負載),並簡化您的編程。
循環
盡早在循環內放置條件語句,以使Perl不執行無用的語句。如
while () {
    chomp;
    next if /^#/;
next可以放在chomp上面。
有選擇性地使用 map 和 grep
摘自 FAQ 3.16: How can I make my Perl program take less memory?
因為 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/; # use above to replace
如果字符串很長,正則表達式很複雜,可以使用study來加快速度
數據結構
Tie::SubstrHash 對於某些類型的數據結構會有所幫助
=pod
如果您用了一大塊 pod 來描述你的代碼,那麼請盡量不要將其放在文件的上面或中間部分。雖然 perl 分析器能很快的跳過 pod ,但是這不是魔法,它還是需要一點時間的。它還是需要從磁盤中讀入它,並且讀入的目的僅僅是忽略它。將所有的pod放到__END__後面,那樣 Perl 編譯器就不會去注意它。
但是將pod與相關代碼放在一起或許是種好習慣。
warnings/strict
強烈建議編程和調試時開啟,而在代碼發佈時去掉它們。
Final
最後強烈建議各位閱讀參考裡的「When perl is not quite fast enough」。
參考/Refer
訪客無法瀏覽此圖片或連結,請先 註冊登入會員
When perl is not quite fast enough
人民郵電出版社出版的Martin C. Brown寫的《Perl參考大全》,21.4 優化代碼

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。