Tak, gc jest amortyzowane przez stały czas. Załóżmy, że masz algorytm działający przez czas ze szczytowym zestawem roboczym o rozmiarze k . Teraz zauważ, że możesz przydzielić co najwyżej O ( n ) słowa podczas wykonywania programu, a koszt czasu uruchomienia kopiującego śmietnika wynosi O ( k ) (tj. Koszt gc jest proporcjonalny do sumy ilość danych na żywo). Jeśli więc uruchomisz gc co najwyżej O ( n / k ) razy, wówczas całkowity koszt środowiska wykonawczego jest ograniczony przez O ( n )nkO ( n )O(k)O(n/k)O(n), co oznacza, że zamortyzowany koszt gc jest stały. Jeśli więc masz kolektor w stylu Cheneya, a każdy półprzestrzeń ma rozmiar , łatwo zauważyć, że nie można wywołać pełnej kolekcji więcej niż raz na n / k kroków, ponieważ przydzielenie k słów zajmuje O ( k ) czas, a zestaw roboczy nigdy nie przekracza rozmiaru k , co daje ci pożądaną granicę. Uzasadnia to ignorowanie problemów z GC.2kn/kkO(k)k
Jednak jednym z przypadków, w których obecność lub nieobecność gc nie można pominąć, jest pisanie struktur danych bez blokady. Wiele nowoczesnych, pozbawionych blokad struktur danych celowo wycieka pamięć i polega na gc w zakresie poprawności. Wynika to z faktu, że na wysokim poziomie działają one w taki sposób, że kopiują niektóre dane, wprowadzają w nich zmiany i próbują atomowo aktualizować je za pomocą instrukcji CAS i uruchamiać to w pętli, aż CAS się powiedzie. Dodanie deterministycznego dezalokacji do tych algorytmów sprawia, że są one znacznie bardziej złożone, dlatego ludzie często nie przejmują się tym (zwłaszcza, że często są one ukierunkowane na środowiska podobne do Java).
EDYCJA: Jeśli chcesz granice bez amortyzacji, kolekcjoner Cheney tego nie zrobi - skanuje cały zestaw na żywo za każdym razem, gdy jest wywoływany. Słowo kluczowe dla wyszukiwarki Google to „odśmiecanie w czasie rzeczywistym”, a Djikstra i in. a Steele dała pierwsze kolekcjonerskie markery w czasie rzeczywistym, a Baker pierwszy gc.
@article {dijkstra1978fly,
title = {{Odrzucanie śmieci w locie: ćwiczenie we współpracy}},
autor = {Dijkstra, EW i Lamport, L. i Martin, AJ i Scholten, CS i Steffens, EFM},
journal = {Komunikacja ACM},
wielkość = {21},
liczba = {11},
strony = {966--975},
issn = {0001-0782},
rok = {1978},
wydawca = {ACM}
}
@article {steele1975multiprocessing,
title = {{Multiprocessing compactifying garbage collection}},
autor = {Steele Jr, GL},
journal = {Komunikacja ACM},
wolumin = {18},
liczba = {9},
strony = {495--508},
issn = {0001-0782},
rok = {1975},
wydawca = {ACM}
}
@article {baker1978list,
title = {{Przetwarzanie listy w czasie rzeczywistym na komputerze szeregowym}},
autor = {Baker Jr, HG},
journal = {Komunikacja ACM},
wielkość = {21},
liczba = {4},
strony = {280--294},
issn = {0001-0782},
rok = {1978},
wydawca = {ACM}
}
List.map
w OCaml jest w rzeczywistości kwadratową złożonością, ponieważ głębokość stosu jest liniowa, a stos przechodzi się za każdym razem, gdy ewakuuje się pokój dziecinny. To samo dotyczy głównych wycinków napotykających duże tablice wskaźników.Ostateczne odwołanie do śmiecia to:
Ben Zorn pracował przy pomiarze rzeczywistych kosztów różnych algorytmów zbierania śmieci, chociaż w najnowszym artykule przedstawiono znacznie bardziej wszechstronne porównanie:
Więcej informacji:
źródło