Le strutture ad albero sono intrinsecamente dannose per le prestazioni di garbage collector mark-and-sweep?

3

Sto implementando una gerarchia del volume di delimitazione in F #. Dato che sarebbe per un gioco, voglio che il garbage collector sia il più veloce e raro possibile.

Sembra però che potrei dover tirare alcuni trucchi whacky , probabilmente pre-allocando tutto. Ciò significa che non posso avere molte cose immutabili, e che devo sapere in anticipo quanto sarà grande il mio albero - un grave fastidio.

Probabilmente finirò col mordere il proiettile e fare proprio questo (o forse tornare al C ++), ma per la cronaca, gli alberi sono intrinsecamente dannosi per le prestazioni del GC? Sembrerebbe che lo siano, considerando che lo stadio del marchio dovrebbe attraversare molti nodi.

    
posta Rei Miyasaka 02.01.2012 - 11:01
fonte

3 risposte

1

Capisco che tu sia preoccupato per questo problema non perché soffri della sindrome di ottimizzazione prematura, ma perché sei preoccupato che questo potenziale problema di prestazioni debba essere preso in considerazione al fine di fare le giuste scelte di tecnologie nel molto all'inizio del progetto.

Se questa è la tua preoccupazione, non c'è risposta "oh, sì, ucciderà davvero il GC" o "no, non preoccuparti, andrà tutto bene" di cui dovresti davvero dipendere.

Basta implementare uno scenario di test e vedere da solo come si comporta.

(La mia ipotesi è che non ci saranno problemi di sorta, anche in condizioni 10 volte peggiori rispetto all'utilizzo previsto.)

    
risposta data 02.01.2012 - 11:52
fonte
2

Lo sono. Tuttavia, il GC CLR è troppo intelligente per questo. Una volta che i nodi dell'albero sopravvivono a una raccolta, l'aspetto generazionale prenderà il sopravvento e gli impedirà di segnare inutilmente l'albero più e più volte. Avresti bisogno di un albero big-ass per contrassegnare un rallentamento notevole.

Modifica: ricorda che gli alberi sono strutture molto comuni . I progettisti del GC CLR avranno considerato e profilato ampiamente questa situazione nell'ultimo decennio.

    
risposta data 02.01.2012 - 11:10
fonte
1

Le "trucchetti" che menzioni non sono così bizzarri. Dato il contenuto e la data dell'articolo, sembra che sia basato su un altro articolo del blog scritto da Shawn Hargreaves - che era ben noto per il suo lavoro su XNA (fino a poco tempo fa, quando si è trasferito al team di Windows Phone).

Uno dei motivi principali per cui le prestazioni del GC sono un grosso problema è dato dal fatto che i dispositivi che eseguono il framework compatto (telefoni, xbox) non hanno lo stesso tipo di garbage collection generazionale delle versioni PC / Server del GC. Fanno una collezione completa ogni volta (vedi qui ).

Per rispondere direttamente al tuo "per il record": No, non sono intrinsecamente cattivi. Devi prendere in considerazione la tua piattaforma di distribuzione, indipendentemente da ciò che stai facendo. Considera che anche i giochi scritti in C ++ o senza una garbage collection devono considerare quando creano ed eliminano risorse, altrimenti i framerate ne risentiranno. Ecco perché abbiamo schermi di caricamento e perché le tecnologie di streaming delle risorse sono così interessanti e difficili da implementare.

    
risposta data 02.01.2012 - 17:08
fonte

Leggi altre domande sui tag