2017-09-23 1 views
2

Ich arbeite derzeit an einem Projekt mit dem Modul vcache-trie. Ich versuche, die Ausführungsgeschwindigkeit einer Forschung innerhalb des Trie mit der lookupPrefix Funktion zu testen.Erstellen Sie eine NFData-Instanz für Trie

Dies ist ein Benchmark mit Kriterium für diesen Zweck erstellt:

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

wo trie in einer Umgebung für Kriterium erstellt wird. Der Typ dieses Trie ist Trie Int.

Da die Umgebung in Normalform ausgewertet wird, muss ich eine Instanz von NFData für diesen speziellen Typ erstellen.

Der Inhalt des Trie für diesen speziellen Fall ist [(ByteString, Int)], ich nehme an, die Instanz von NFData sollte jedes Tupel auswerten, aber ich bin nicht sicher, wie es weitergeht.

Jede Hilfe wäre sehr dankbar, danke, dass Sie sich die Zeit genommen haben, mein Problem zu lesen.

Antwort

5

Das folgende sollte es tun, können aber etwas weniger effizient sein als ein NFData mit Zugriff auf die interne Darstellung zu schreiben (wie von @JonPurdy vorgeschlagen):

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

Im Idealfall sollten Sie sich an den Betreuer von vcache-trie mit einer Feature-Anforderung oder einem Patch wenden, um die Instanz hinzuzufügen, da Sie zum Schreiben auf die interne Repräsentation von Trie zugreifen müssen.

Als Abhilfe können Sie eine lokal modifizierte Version des Pakets machen (zum Beispiel eine lokale Kasse extra-deps in Stack-Zugabe) und entweder fügen Sie eine NFData Instanz selbst, oder fügen Sie deriving (Generic)-Trie und verwenden deepseq-genericsNFData zu implementieren.

+1

Vielen Dank für Ihre Antwort, es ist mit der Arbeits Problemumgehung. Ich werde den Betreuer wie vorgeschlagen kontaktieren. – Barbrousse

+0

@Barbrousse, ich bin mir nicht sicher, ob eine 'NFData'-Instanz wirklich das bekommt, was Sie in diesem Fall wollen. Aus der Dokumentation: "Die Hauptmotivation für VRefs ist es, speichergespeicherte Werte zu unterstützen, d. H. Sehr große Datenstrukturen, die nicht auf einmal im RAM gespeichert werden sollten." Ich denke nicht, dass es sehr wahrscheinlich ist, dass Sie in der Lage sind, einen wirklich sinnvollen Eindruck von der Leistung einer Operation zu bekommen, indem Sie ein 'deepseq' auf das Ergebnis anwenden. Das heißt, das Paket sollte sowieso eine 'NFData'-Instanz anbieten. – dfeuer

+0

@dfeuer Danke für Ihre Antwort, haben Sie eine Idee von einem genaueren Test, der für diesen Fall erstellt werden könnte? – Barbrousse