2014-01-24 83 views
4

我一直在研究一些用於數據挖掘的Perl庫。這些庫充滿了用於收集和處理信息的嵌套循環。我正在使用嚴格模式,並且我總是在第一個循環之外用my聲明我的變量。例如:在Perl中聲明變量內部或外部的循環,最佳實踐

# Pretty useless code for clarity purposes: 

my $flag = 1; 
my ($v1, $v2); 

while ($flag) { 
    for $v1 (1 .. 1000) { 

    # Lots and lots of code... 

    $v2 = $v1 * 2; 
    } 
} 

對於我讀過here,性能明智的,它是更好地宣佈他們的循環之外,但是,我的代碼的維護變得越來越困難,因爲一些變量的聲明最終離他們實際使用的地方很遠。

像這樣的事情會更容易十個分量:

my $flag = 1; 

while ($flag) { 
    for my $v1 (1 .. 1000) { 

    # Lots and lots of code... 

    my $v2 = $v1 * 2; 
    } 
} 

我沒有太多的使用Perl的經驗,因爲我來自與C++主要工作。在某些時候,我想開源我的大部分庫,所以我希望它們儘可能地讓所有Perl專家滿意。

從專業的Perl開發人員的角度來看,這些選項之間最適合的選擇是什麼?

+0

如果這兩者之間的性能差異實際上很重要,那麼您應該使用C.爲了可維護性,您已經發現'for $ foo'更好;儘可能在有限的範圍內聲明事物。 – ThisSuitIsBlackNot

回答

14

一般規則是儘可能將每個變量聲明爲後期

如果一個變量的值並不需要保持整個循環的迭代然後聲明它內部環路,或作爲用於for循環的循環控制變量。

如果需要在整個循環迭代中保持靜態(如$flag),則在之前立即聲明循環。

對了,還有,如果你放棄,並在每次執行塊的時間重新分配一個變量,但編程和維護成本是目前最重要的效率,並應始終先放最小速度的成本支付。

在開始工作之前,您不應該優化您的代碼,並發現運行速度太慢;即使如此,將聲明移動到文件的頂部也是可能產生有益差異的妥協列表的很長一段路要走。

4

優化可讀性。這意味着在儘可能小的範圍內聲明變量。理想情況下,我可以同時看到變量聲明和變量的所有用法。我們只能在頭腦中保留非常有限的上下文,因此在其使用附近聲明變量使得更易於理解,編寫和調試代碼。

瞭解什麼變體更好地執行很難估計,並且難以測量,因爲效果會很小。但是,如果性能大致相當,我們不妨使用更易讀的變體。

我個人經常嘗試編寫單一賦值表單中的代碼,其中變量未被重新分配,並且避免了類似push @array, $elem的變體。這確保了變量的名稱和它的值總是可以互換的,這使得更容易推理代碼。這意味着每個變量聲明也是一個初始化,它將刪除整個類的錯誤。

+0

我明白你在說什麼,但最後一段的例子會有所幫助。 – Borodin

+0

是的......你也把那段las段落給了我。 – calvillo

+2

@calvillo:什麼意思是他從不*改變變量的值。如果需要從變量派生的值,那麼他使用一個新變量。但我不明白這是如何與像數組和哈希聚合變量一起工作。分配一個完整的數組並且永遠不要改變它看起來並不實際,除了明智地使用'map',它可以輕鬆地混淆代碼的目的。 – Borodin

0

當你準備好定義變量時,你應該聲明變量,除非你需要在更大範圍內訪問答案。即使將值明確地傳回,也會更容易遵循。

0

您給出的特定示例(聲明循環變量)可能不會影響性能。正如您所引用的link所說,性能差異的原因歸結爲變量是否在循環內初始化。在for循環的情況下,它將以任何方式初始化。

我幾乎總是在最內層的範圍內聲明變量。它減少了犯錯的機率。如果性能在特定的循環中成爲問題,我只會改變這一點。

相關問題