2012-04-13 7 views
0

hatte ich diesen Code:Plötzliche Verlangsamung mit fauler Sequenz

:history 
(cons [t (:latest thing)] (take n (:history thing))) 

, die für das Hinzufügen eines Rollfensters der jüngsten Geschichte zu einer Karte auf jeder Iteration meines Programms ist. Was ich fand war, dass nach einer bestimmten Anzahl von Iterationen (~ 50) mein Programm dramatisch und progressiv verlangsamen würde. wenn ich

während änderte den Code:

:history 
(cons [t (:latest thing)] (take n (vec (:history thing)))) 

dann das Programm lief leicht auf jeder Iteration länger (wie der faule seq realisiert wurde), sondern lief konsequent und nicht verlangsamen.

Neu für Clojure Ich verstehe nicht ... ist es mit Chunked-Sequenzen zu tun?

Antwort

1

Ich denke durch Programmverlangsamung meinst du zu sagen "der Verbrauch dieser Lazy Sequence verlangsamt sich, wenn die Sequenz größer wird aufgrund von möglichen Cons-Operationen, die dein erstes Code-Sample tut". Der Grund dafür ist, dass beim Erstellen einer Lazy-Sequenz mit Lazy-Operatoren wie Cons eine Kette von Operationen (Funktionen) zum Generieren der Sequenz erstellt wird und diese Operationskette jedes Mal ausgeführt wird, wenn Sie diese Lazy-Sequenz für ex verwenden: 50 Operationen von Cons erstellt 50 verkettete Funktionsaufrufe, die jedes Mal ausgeführt werden, wenn Sie die Sequenz konsumieren, die offensichtlich langsam ist, als wenn Sie einen Vektor mit 50 Elementen haben und diesen konsumieren.

In Ihrem zweiten Fall wird die faule Sequenz nur 1 Betrieb (dh die Nachteile) und Ruhebetrieb von einem bereits realisierten Vektor nehmen wird (dh den Vektor-Aufruf)

+0

ok, ich, warum den ersten Fall sehen ist schlecht, aber warum die Verlangsamung nur, wenn sie eine bestimmte Anzahl von Iterationen erreicht? ist das wegen der eingespannten Sequenzen? – Hendekagon

+0

eigentlich, jetzt bin ich verwirrt, ist der erste Fall schlecht? Werden all diese verschachtelten Cons-Operationen jedes Mal ausgeführt, wenn ich die Sequenz konsumiere? Da ich jedes Mal n nehme, enthält die Sequenz nur diese n Elemente. Es ist auf eine andere Weise schlecht, das ist, dass es eine verschwenderische Art ist, es trotzdem zu tun - ich sollte den Rest und das Conjen oder etwas nehmen, damit ich diese n Iterationen nicht brauche. – Hendekagon

+0

ja, das sollte ich machen (cons letzte (butlast history)) – Hendekagon

Verwandte Themen