Für integrierte transientenaktivierte Clojure-Datenstrukturen (und alle Datenstrukturen, die mit der gleichen allgemeinen Strategie implementiert wurden) gibt es keinen lesebezogenen Vorteil für die Verwendung von Transienten. In der Tat, Transienten müssen ein wenig mehr Arbeit für Nachschlagewerke - eine einzige .get
auf einem AtomicReference
und eine Verzweigung auf das Ergebnis. Normalerweise ist dies kaum messbar, daher ist es kein Problem, Transienten zu verwenden, bei denen das Schlüsselwertversprechen (schnellere Update-Ketten) relevant ist, aber auf jeden Fall bedeutet das, dass sie Lookups nicht schneller machen.
Dies liegt daran, Transienten fast die gleichen internen Strukturen wie ihre persistent Pendants verwenden (in die Tat nach einem persistent!
Aufruf, die interne Baum der transienten wird direkt in der neu geschaffenen persistenten Datenstruktur verwendet wird), so dass ihre Lookup-Logik ist sehr fast gleich, aber in Bezug auf den allgemeinen API-Vertrag der Transienten müssen alle versuchten Lookups nach einem persistent!
-Aufruf für einen bestimmten Transienten zu einem IllegalAccessError
führen. Dies kostet Transienten eine kleine Menge zusätzlichen Aufwands jedes Mal, wenn man versucht, nachzuschlagen.
Es gibt einige kleinere Unterschiede: z.B. Transiente Vektoren verwenden immer ein 32-Elemente-Array als Tail (gepaart mit einem Feld, das den aktuellen "End-Index" verfolgt), während persistente Vektoren ein Array von so vielen Elementen verwenden, wie der Tail tatsächlich hält; das bedeutet, dass das Wachsen eines Tails mit einer In-Place-Mutation die meiste Zeit erreicht werden kann (in einer Kette von conj!
s muss nur 1 von 32 ein neues Tail-Array zuweisen), und es verursacht keine Probleme für die persistente Version Wenn Sie persistent!
anrufen, wird der Schwanz wieder getrimmt. Dies beeinflusst die aktuelle Diskussion jedoch nicht wirklich.
In der Tat werden die gleichen kleinen Kosten für Schreibvorgänge auch bezahlt, aber dort überwiegen die Vorteile oft in der Lage sein, die Datenstruktur an Ort und Stelle statt neue Knoten zu verteilen leicht überwiegen.