2017-09-23 5 views
2

現在、vcache-trieモジュールを使用しているプロジェクトで作業しています。私はlookupPrefix関数でトライ内の研究の実行速度をテストしようとしています。TrieのNFDataインスタンスを作成する

これは、この目的のための基準で作成したベンチマークです:トライが基準の環境で作成され

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

。このトライのタイプはTrie Intです。

環境が通常の形式に評価されるため、この特定の種類のインスタンスを作成する必要があります。NFData

この特定のケースの内容は[(ByteString、Int)]ですが、NFDataのインスタンスは各タプルを評価する必要がありますが、どのように処理するかはわかりません。

ご迷惑をおかけして申し訳ありませんが、私の問題を読んでいただきありがとうございます。

答えて

5

次は、トリックを行う必要がありますが、わずかに少ない効率的な内部表現(@JonPurdyにより示唆されるように)にアクセスしてNFDataを書くよりも可能性がありますあなたの応答のための

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

vcache-trieのメンテナーに連絡する必要があります。機能をリクエストするには、Trieの内部表現にアクセスする必要があります。回避策として

、あなたは、パッケージのローカルで変更されたバージョンを作る(例えば、スタック内のextra-depsにローカルチェックアウトを追加すること)のいずれかNFDataインスタンスを自分で追加するか、Triederiving (Generic)を追加し、NFDataを実装するためにdeepseq-genericsを使用することができます。

+1

おかげで、それはで働いています回避策。私は提案されたようにメンテナーに連絡します。 – Barbrousse

+0

@Barbrousse、私は 'NFData'インスタンスが本当にあなたが望むものが得られるかどうかは分かりません。ドキュメントから: "VRefの第一の動機は、メモリキャッシングされた値、つまり一度にすべてRAMに格納すべきではない非常に大きなデータ構造をサポートすることです。私は結果に 'deepseq'を実行することによって、操作のパフォーマンスの意味が分かります。つまり、パッケージはおそらく 'NFData'インスタンスを提供するはずです。 – dfeuer

+0

@dfeuerご回答いただきありがとうございます。この場合、より正確なテストを作成することができますか? – Barbrousse

関連する問題