2017-09-23 65 views
2

我目前正在使用vcache-trie模塊開展一個項目。我正在用lookupPrefix函數來測試一個內部研究的執行速度。爲Trie創建一個NFData實例

這是標準創建用於此目的的基準:

bench "trieSearch" $ nf (lookupPrefix (pack "ab")) trie 

凡在標準的環境中創建索引樹。這個特里的類型是Trie Int

由於環境評估爲正常形式,我需要爲此特定類型創建一個NFData的實例。

此特定案例的trie的內容是[(ByteString,Int)],我假設NFData的實例應評估每個元組,但我不知道如何繼續。

任何幫助將不勝感激,感謝您花時間閱讀我的問題。

回答

5

下應該做的伎倆,但可能會稍微比訪問內部表示寫一個NFData(由@JonPurdy的建議)低效率:

instance NFData a => NFData (Trie a) where rnf = rnf . toList 
1

理想情況下,您應該聯繫vcache-trie的維護人員提供功能請求或補丁以添加實例,因爲您需要訪問Trie的內部表示以編寫它。

作爲一種變通方法,可以使包裝的局部修改版本(例如,在堆棧添加本地結帳extra-deps)和用戶可以自己添加一個NFData實例,或添加deriving (Generic)Trie和使用deepseq-generics實現NFData

+1

感謝您的迴應,它的工作與解決方法。建議我會聯繫維護人員。 – Barbrousse

+0

@Barbrousse,我不確定在這種情況下,'NFData'實例是否能真正幫到你。從文檔:「VRefs的主要動機是支持內存緩存值,即非常大的數據結構,不應該一次全部存儲在RAM中。」我認爲你不可能通過對結果執行'deepseq'來獲得真正有意義的操作表現。也就是說,該包應該可能提供一個'NFData'實例。 – dfeuer

+0

@dfeuer感謝您的迴應,您是否有任何想法可以爲這種情況創建更準確的測試? – Barbrousse