2011-06-14 56 views
3

有代碼讀取IORef並基於一些條件和計算創建一個新值。現在它將新的值寫入IORef。但有可能它根本沒有改變。新的價值可能與舊的相同。在寫IORef之前應該檢查一下變化嗎?

關於在寫入IORef之前是否檢查值是否不同,或者不管寫入IORef,有哪些注意事項?

writeIORef檢查設置前是否更改了值?

通過首先檢查,您是否可以避免寫入並可能在性能上節省一點?

回答

8

writeIORef檢查設置前是否更改了值?

writeIORef包裝writeSTRef,它被定義爲

-- |Write a new value into an 'STRef' 
writeSTRef :: STRef s a -> a -> ST s() 
writeSTRef (STRef var#) val = ST $ \s1# -> 
    case writeMutVar# var# val s1#  of { s2# -> 
    (# s2#,() #) } 

首先檢查,你可以避開編寫並保存性能一點可能?

關於在寫入IORef之前是否檢查值是否不同,或者不管寫入IORef,有哪些注意事項?

這實際上取決於所討論的算法。你想要優化什麼?讀取與寫入的頻率/比率是多少?你存儲什麼樣的數據?它是如何包裝的?有關數據的平等比較的成本是多少?

在確定是否要在位置上破壞性地更新單元格時,存在一系列要考慮的因素:某些算法特定,某些取決於緩存局部性,其他因素取決於緩衝區的結構和形式代碼GHC生成。因此,回答你的問題是非常困難的。

來自高德納引述:

我們應該忘記小的效率,講的時候約97%:過早的優化是所有罪惡

除非你是在根你試圖從一些很好理解的實現中剔除每一點表現的階段,你最好選擇的路徑是

  • 簡單EST實施
  • 最簡單的推理

,並獲得與它。如果你的在你想調整你的程序的階段,我建議你學習讀GHC's human-readable generated output (Core),因爲那時你可以做出這樣的決定(在一個非常精細的層次上)每個節目的基礎。

+4

另外需要注意的是:由於IORef的內容只是一個指針,因此寫入它就是* fast *。比較其內容與新值相等的價值相當昂貴。 – Carl 2011-06-14 16:10:06

相關問題