天天看點

《Clojure資料分析秘笈》——3.4節使用commute獲得更好的性能

本節書摘來自華章社群《clojure資料分析秘笈》一書中的第3章,第3.4節使用commute獲得更好的性能,作者(美)eric rochester,更多章節内容可以通路雲栖社群“華章社群”公衆号檢視

3.4 使用commute獲得更好的性能

3.2節中建立的stm系統有一個小問題:試圖引用并更新total-hu和 total-fams的程序會不必要地競争這兩個全局變量。由于為了等待通路這兩個資源,程序裡任務都中斷了,許多任務都需要重試。

但是其實沒必要如此。程序僅使用可交換函數(#(+ sum-? %))來更新這些值。這些更新執行的順序無關緊要。而且由于處理過程完成之前處于阻塞狀态,不必擔心兩個引用會不同步。它們在通路其值之前會最終回到同一狀态,這對于這種應用場景來說非常好。

為了處理這種情況(使用可交換函數計算引用值),應該使用commute替換alter。alter函數當場更新引用值;commute将更新操作加入隊列中待引用未被占用時再執行。這避免了引用的競争問題并可以加速系統運作。

繼續閱讀