2012-12-09 12 views
5

Napisałem szybką i brudną implementację podwójnie połączonej listy dla javascript. Chciałbym móc usunąć wiele (kolejnych) węzłów naraz i zastanawiałem się: czy wystarczy odciąć końce tych najbardziej zewnętrznych węzłów, które usuwam, lub czy muszę oddzielnie usuwać każdy węzeł. Jeśli dobrze rozumiem odbiór śmieci w javascriptu, gdy nic nie wskazuje już na te kolejne węzły, nawet jeśli są one nadal ze sobą połączone, powinny być one obsługiwane przez odśmiecarkę, czy to prawda? Jeśli ktoś mógłby mi powiedzieć, jak sam mógłbym to sprawdzić lub zweryfikować, bardzo bym to docenił.Zamknięcie i zbieranie śmieci: najbardziej efektywny sposób na usunięcie kolejnych węzłów z połączonej listy

Odpowiedz

6

Według MDN:

Począwszy od 2012 roku, wszystkie nowoczesne przeglądarki dostarczy mark-and-sweep garbage collector. Wszystkie udoskonalenia dokonane w dziedzinie zbierania śmieci w JavaScripcie (generowanie/generowanie/współbieżne/równoległe usuwanie śmieci) w ciągu ostatnich kilku lat to usprawnienia w implementacji tego algorytmu, ale nie ulepszenia w stosunku do samego algorytmu zbierania danych ani redukcja definicji kiedy „celem nie jest już potrzebny”

Mark i algorytmy usuwające rozpocząć od obiektów korzeniowych i znaleźć wszystkie osiągalne obiekty następnie zebrać wszystkie te nie osiągalne, więc dla tych przeglądarek odcinając węzłów będzie dobrze. Starsze przeglądarki używają liczenia odwołań, co oznacza, że ​​obiekty są zbierane tylko wtedy, gdy mają 0 odniesień do nich, więc w tym przypadku cykle podwójnie połączonej listy będą problematyczne. Następnie trzeba w jakiś sposób ciąć cykle w kolejnych węzłach (ustawiając odniesienia do wartości null, usuwając słowo kluczowe itd.).

Więc jeśli pracujesz nad przeglądarkami moden, wszystko działa dobrze, ale będziesz potrzebował nieco bardziej zaangażowanego rozwiązania, jeśli chcesz mieć kompatybilność z przeglądarkami takimi jak IE6/7 (zawsze tak jest, czyż nie? ..)

+0

Dzięki! Świetny link również. – DudeOnRock

Powiązane problemy