2014-02-19 30 views
1

我正在閱讀這篇關於如何在Ruby in Functional Style中編程的文章。 https://code.google.com/p/tokland/wiki/RubyFunctionalProgrammingRuby中的命令式編程與函數式編程

其中一個是把我關注的例子是:

# No (mutable): 
output = [] 
output << 1 
output << 2 if i_have_to_add_two 
output << 3 

# Yes (immutable): 
output = [1, (2 if i_have_to_add_two), 3].compact 

儘管「可變」選項不太安全,因爲我們改變了數組的值時,inmutable一個似乎是因爲效率較低它調用.compact。這意味着它必須迭代數組返回一個沒有nil值的新數組。

在這種情況下,哪個選項是可取的?一般來說,如何選擇不變性(功能性)和性能(在緊急解決方案更快的情況下)?

回答

3

你沒有錯。通常情況下,純功能解決方案將比破壞性解決方案慢。不變值通常意味着更多的分配必須繼續下去,除非語言對它們進行了非常好的優化(而Ruby不是)。

然而,它並不常見。擔心特定操作的表現並不是佔用你99%的時間。從每秒運行100次的代碼中剔除微秒毫無意義。

最好的方法通常是做任何事情使你的代碼變得最乾淨。通常這意味着利用該語言的功能特性 - 例如,mapselect而不是map!keep_if。然後,如果您需要加快速度,那麼您就有了一個很好的,乾淨的代碼庫,您可以進行更改,而無需擔心您的更改會使一段代碼跺碎另一段代碼的數據。

+0

一般來說,@Chuck說的是有道理的。從另一個角度來看,考慮移動開發內存緊張和更好的性能意味着更好的電池壽命等;例如在iOS開發中,如果您不需要修改數組,並且可以在需要時使用其子類「NSMutableArray」,則可以使用不可變的NSArray。 – Abdo

+2

@Ado在我看來,這個想法在移動開發中依然存在。重點在於,大部分代碼只能輕易地影響程序的CPU使用。考慮80/20經驗法則;如果80%的運行時間花費在20%的代碼中,那麼甚至優化其他80%的代碼,以至於將運行時間減少到零,只會使CPU /電池減少20%消耗你的應用程序。編寫/維護清潔代碼所節省的時間意味着*即使性能是您的目標*,您最好只花​​時間優化它在哪些方面發揮作用。 – Ben

+0

@Chuck:我同意你的好答案。謝謝! –