Ho il seguente problema. Ho un gioco che esegue in media 60 fotogrammi al secondo. Ogni frame ho bisogno di memorizzare valori in un contenitore e non ci devono essere duplicati.Quale contenitore per memorizzare valori univoci?
Probabilmente deve memorizzare meno di 100 elementi per fotogramma, ma il numero di chiamate da inserire sarà molto più (e molti rifiutati a causa di esso devono essere unici). Solo alla fine del frame devo attraversare il container. Quindi circa 60 iterazioni del contenitore per fotogramma, ma molti più inserimenti.
Ricordare che gli elementi da memorizzare sono numeri interi semplici.
Ci sono un sacco di contenitori che posso usare per questo ma non riesco a decidermi cosa scegliere. Le prestazioni sono il problema chiave per questo.
Alcuni pro/contro che ho raccolto:
vettore
- (PRO): di memoria contigui, un fattore enorme.
- (PRO): La memoria può essere prenotata prima, pochissimi Accantonamenti/deallocazioni dopo
- (CON): No alternativa che attraversare il contenitore (std :: trovare) ciascun inserto() per trovare le chiavi uniche? Il confronto è semplice anche se (interi) e l'intero contenitore può probabilmente in forma cache
impostato
- (PRO): semplice, significava chiaramente per questo
- (CON): Non tempo di inserimento costante
- (CON): un sacco di allocazioni/deallocazioni per frame
- (CON): memoria non contigua. Attraversare un insieme di centinaia di oggetti significa saltare in giro in memoria.
unordered_set
- (PRO): semplice, significava chiaramente per questo
- (PRO): caso medio costante di tempo inserire
- (CON): Visto che devo conservare interi, operazione di hash è probabilmente molto più costosa di qualsiasi altra
- (CON): un sacco di allocazioni/deallocazioni per frame
- (CON): memoria non contigua. Attraversare un insieme di centinaia di oggetti significa saltare in giro in memoria.
che sto appoggiato in corso il vettore di rotta a causa dei modelli di accesso di memoria, anche se insieme è chiaramente inteso per questo problema. Il grosso problema che non mi è chiaro è se attraversare il vettore per ogni inserto sia più costoso delle allocazioni/deallocazioni (specialmente considerando quanto spesso questo deve essere fatto) e le ricerche di memoria del set.
So che alla fine tutto si riduce alla profilazione di ogni caso, ma se non altro come un vantaggio iniziale o solo teorico, quale sarebbe probabilmente la cosa migliore in questo scenario? Ci sono pro/contro che potrei aver perso?
EDIT: Come non ho citato, il contenitore viene cancellato() alla fine di ogni frame
*** Basta misurare *** Dato che 'unordered_set' è ** il classico "set" contenitore **, con la semantica non ordinata-no-duplicati e la migliore complessità asintotica, mi piacerebbe dargli un colpo, ma è probabile che 'vector' lo batterà per contenitori di piccole dimensioni, poiché ha proprietà di localizzazione della cache molto migliori. –
Che ne pensi di fornire il tuo allocatore, che è in grado di superare le inefficienze nella gestione della memoria? (ad esempio fornendo un pool di oggetti) –
Qualunque cosa tu faccia, prova a incapsulare correttamente il tuo codice e usa 'auto' per tracciare i tipi in modo da poter cambiare facilmente la tua scelta di contenitore in futuro. Quindi misura. –