Das Anhängen eines Elements an ein Millionenelement ArrayList
kostet jetzt eine Referenz und das Kopieren einer Referenz in der Zukunft, wenn die Größe der ArrayList
geändert werden muss.Effizienz des Anhängens an Vektoren
Wie ich es verstehe, muss das Anhängen eines Elements an ein Millionenelement einen neuen Pfad erstellen, der aus 4 Arrays der Größe 32 besteht. Das bedeutet, dass mehr als 120 Referenzen berührt werden müssen.
Wie schafft es Clojure, den Vektor-Overhead auf "2,5-mal schlechter" oder "4-mal schlechter" zu halten (im Gegensatz zu "60-mal schlechter"), was in mehreren Clojure-Videos behauptet wurde? Hat es etwas mit Caching oder Fundort zu tun oder etwas, das mir nicht bekannt ist?
Oder ist es irgendwie möglich, einen Vektor intern mit Mutation zu bauen und ihn dann unveränderlich zu machen, bevor er ihn der Außenwelt offenbart?
Ich habe die Frage scala auch markiert, seit scala.collection.immutable.vector
ist im Grunde die gleiche Sache, richtig?
Da die Frage Zahlen enthält, ist es möglicherweise erwähnenswert, dass der Clojure-Vektor ein * Baum * von 32-Bit-Zeigern ist, von denen jede Ebene fünf Indexbits ausmacht. So kann der Baum nur fünf oder sechs Ebenen tief sein. – Thumbnail
Bedeutet es, dass der Vektor vor Clojure langsamer als append ist? – ZhekaKozlov
@ZhekaKozlov Ja, das Hinzufügen zum Ende ist eine konstante Zeitoperation. Das Hinzufügen zum Anfang ist linear. Wenn Sie jedoch nicht möchten, dass das Ergebnis ein Vektor ist (oder nicht sofort), können Sie eine faule Verkettung (oder eine andere Datenstruktur) verwenden. –