Sì, gc è tempo costante ammortizzato. Supponiamo di avere un algoritmo che gira per il tempo con un set di picco di lavoro di dimensione k . Ora, nota che puoi allocare al massimo O ( n ) parole durante l'esecuzione del programma e che il costo del tempo di esecuzione di un garbage collector copiante è O ( k ) (cioè, il costo di un gc è proporzionale al totale quantità di dati in tempo reale). Quindi, se si esegue gc al massimo O ( n / k ) volte, il costo di runtime totale è limitato da O ( n )nKO ( n )O ( k )O ( n / k )O ( n ), il che significa che il costo ammortizzato del gc è costante. Quindi se hai un raccoglitore in stile Cheney, con ogni semispace di dimensioni , allora è facile vedere che una collezione completa non può essere invocata più di una volta ogni passi di n / k , poiché l'allocazione di k parole richiede O ( k ) tempo e il set di lavoro non supera mai la dimensione k , che ti dà il limite desiderato. Ciò giustifica l'ignoranza dei problemi di gc.2 kn / kKO ( k )K
Tuttavia, un caso in cui la presenza o l'assenza di gc non è ignorabile è quando si scrivono strutture di dati senza blocco. Molte moderne strutture dati prive di blocchi perdono deliberatamente memoria e si affidano a gc per la correttezza. Questo perché ad un livello elevato, il modo in cui funzionano è copiare alcuni dati, modificarli e provare ad aggiornarli atomicamente con un'istruzione CAS ed eseguirli in un ciclo fino a quando il CAS ha esito positivo. L'aggiunta della deallocazione deterministica a questi algoritmi li rende molto più complessi, e quindi le persone spesso non si preoccupano (specialmente perché sono spesso indirizzate ad ambienti simili a Java).
EDIT: Se vuoi limiti non ammortizzati, il collezionista Cheney non lo farà - scansiona l'intero set live ogni volta che viene invocato. La parola chiave per google per è "raccolta dei rifiuti in tempo reale", e Djikstra et al. e Steele ha dato i primi collezionisti mark-and-sweep in tempo reale, e Baker ha dato il primo compattatore in tempo reale gc.
@article {dijkstra1978fly,
title = {{Raccolta dei rifiuti al volo: un esercizio di collaborazione}},
autore = {Dijkstra, EW e Lamport, L. e Martin, AJ e Scholten, CS e Steffens, EFM},
journal = {Comunicazioni dell'ACM},
= Volume {21},
numero = {11},
Pagine = {}, 966--975
ISSN 0001-0782 = {},
anno = {1978},
publisher = {} ACM
}
@article {steele1975multiprocessing,
title = {{Multiprocessing compactifying garbage collection}},
autore = {Steele Jr, GL},
journal = {Comunicazioni dell'ACM},
= Volume {18},
numero = {9},
Pagine = {}, 495--508
ISSN 0001-0782 = {},
anno = {1975},
publisher = {} ACM
}
@article {baker1978list,
title = {{Elaborazione dell'elenco in tempo reale su un computer seriale}},
autore = {Baker Jr, HG},
journal = {Comunicazioni dell'ACM},
= Volume {21},
numero = {} 4,
Pagine = {}, 280--294
ISSN 0001-0782 = {},
anno = {1978},
publisher = {} ACM
}