2013-12-10 89 views
4

由於定義的功能代碼儘可能避免可變性,所以可以通過從前一個時間展開狀態來編寫有狀態程序。所以,我用純粹的功能風格寫了一個F#遊戲,當然遊戲往往有很多很多的狀態。我基本上使用遊戲對象(例如玩家)的記錄,並且我簡單地映射所有這些狀態以獲得下一個狀態。這工作非常好。但是,隨着我的遊戲結構越來越複雜,我擔心它會因爲複製每個更新而變得遲鈍。我想知道如何在將來避免這些陷阱(不過現在不是這個時候,因爲它還沒有太多問題,但是)。效率與功能範例

那麼,有沒有在功能風格,F#不爲我做任何使用優化顯著,具體涉及到複製大量數據時,只有一小部分可能會改變?另外,有沒有什麼F#可以用我的優勢以同樣的方式?

還有一件事 - 這是我的兩個主要擔心,可能不是真的。我很想把這些弄清楚:

  1. 垃圾收集。由於我最終每秒拷貝數千條記錄,因此必須有大量的對象生成,所有這些都是非常短暫的,因爲我只是拋棄舊狀態。這似乎是每秒鐘左右遊戲中短暫而難以察覺的跳躍的可能原因。

  2. 是F#高效的拷貝記錄了所有,但更新的幾個字段?如果不是,我該如何提高效率?

+1

這是一個非常廣泛的問題。試着把注意力集中在每個問題的一個問題上(最好是具體的東西 - 嘗試寫一些慢的問題,然後詢問如何更快地寫出問題,這樣我們就有一些具體的工作)。 – mydogisbox

+1

我會本地化您的應用程序的熱路徑,將其與代碼的其餘部分分開,然後讓它在內部變爲可變。 –

+1

吶,別擔心。 perf的主要障礙是可理解性。作爲第一個近似,任何可以理解的代碼最終都會比其他任何不可代碼的代碼更快,不管使用什麼方法。當然要擠掉最後一滴果汁,並且只有在正確測量時間之後,您才必須使用突變,但這應該是您最擔心的問題。 – nicolas

回答

4

那麼,有沒有在功能 風格,F#不爲我做任何使用優化顯著,具體涉及到複製數據的大 塊時只有一小部分可能會改變?

確實如此,您正在複製「大塊數據」?

通常,不可變數據結構的優點是您不需要複製它們。例如,如果您有功能性地圖,則可以「更新」一些數據,但大多數數據保持不變,並且在舊地圖和新地圖之間以及地圖的大部分之間共享。

+0

嗯,我認爲不可變數據結構的優點是你不能改變它們。在某些情況下,你是否需要複製一切以獲得下一個狀態?否則,你會如何得到這個下一個狀態? – Jwosty

+0

@Jwosty,讀一讀他說的話。未改變的數據在舊地圖和新地圖之間共享(同樣適用於列表),所以唯一沒有共享的位就是您正在改變的位(無論如何都不會共享)。當然,還有一些邊緣情況(例如,更改列表的「錯誤」結尾)。 – Benjol

+0

啊,我明白了。我想那時真的沒什麼好擔心的!:) – Jwosty