ho due suggerimenti da provare:
In primo luogo, ciò che sull'utilizzo riflettore o ILSpy di guardare dentro generico List<T>
? Suppongo che l'implementazione non sia nella CF o potresti usarla. Il numero di serie List<T>
è supportato da array e utilizza un algoritmo di raddoppiamento a partire dall'array di lunghezza 4, ogni chiamata a .Add sulla Capacità ne provoca il raddoppio ed esegue un Array.Copy nel nuovo array. Non viene ridimensionato a meno che non si imposti esplicitamente la capacità su zero, quindi attenzione da un punto di vista della memoria. Le aggiunte sono una cosa, ma ciascuna Rimuovi farà sì che l'array venga copiato e spostato a sinistra dopo l'indice che è stato rimosso.
Il secondo suggerimento è questo - che dire sulla creazione di una classe personalizzata che avvolge una matrice integer per gestire tale che utilizza un simile doppio algoritmo (o quadruplicare) per Generic List<T>
(per gestire il ridimensionamento), ma dalle ore dire dimensione 256. Potresti aggiungere l'ID di un intero oggetto a questo fuori ordine a tuo piacimento e non raddoppierà troppo spesso. È anche possibile simulare una rimozione designando (int) -1 o uint.MaxValue come "indice nullo", ovvero senza Array.Copy alla rimozione. Quindi, applica una sorta di ordinamento veloce per fotogramma per ordinare l'array di indice dell'oggetto prima del disegno. Se ordinate in modo ascendente, tutti i -1 appariranno all'inizio (o uint.MaxValues alla fine) e possono essere ignorati. Puoi periodicamente "raccogliere" l'array di indici ridimensionando e rimuovendo il precedente -1
su un thread separato (attenzione - usa il blocco;)
Cosa ne pensi? Basta pensare si compensare alcuni calcoli, una volta per frame per un veloce l'ordinamento (non costoso su xbox vs. allocazione di memoria/raccolta su ogni Rimuovere e alcuni Aggiunge (costoso)
UPDATE -. BlockArray - Lista < T [] > dove T è array di dimensioni fisse
Un ulteriore commento a questo proposito: recentemente stavo sperimentando la struttura dati più efficiente per elenchi di dimensioni dinamiche e ho scoperto sperimentando che i blocchi di array - una classe supportata da un elenco di T [ ], dove ogni T [] era un array di blocchi a dimensione fissa, ad esempio 512, 4096, 8192 come diversi vantaggi rispetto a un elenco semplice <T>.
ho scoperto che l'implementazione di Add() (dove la dimensione è sconosciuta) in un elenco < T [] > notevolmente sovraperformato Aggiungi() per Lista <T>, soprattutto quando la dimensione totale è diventato più grande. Ciò è dovuto all'algoritmo di duplicazione T > di T > che richiede un nuovo array 2x alla dimensione del vecchio e memcpy è il vecchio array ogni volta che viene superata la dimensione.
La velocità di iterazione è simile. La pre-allocazione (capacità predefinita) era molto più lenta di Lista <T> per blocchi di piccole dimensioni (512), ma solo leggermente più lento per blocchi di grandi dimensioni (8192). Rimuove sono problematici, poiché richiedono la copia/spostamento a sinistra di molti blocchi.
Ciò che è interessante è in un elenco < T [] > (elenco di blocchi), è possibile memorizzare nella cache/pool i blocchi. Se abbastanza piccoli, i blocchi di T [] si adattano all'heap di piccoli oggetti (favorendo la compattazione, un'allocazione più rapida), possono essere inseriti nella cache L2 e un numero di blocchi potrebbe essere pre-allocato e raggruppato
Che dire di un 'HashSet'? Non ho idea se questo è nel quadro compatto. Ma dovrebbe scorrere rapidamente in modo decente e aggiungere/rimuovere elementi rapidamente. Dato che è supportato da array, ha pochissime allocazioni. "ma deve essere lo stesso con gli stessi valori" potrebbe essere un po 'problematico, dato che non penso che 'HashSet ' lo garantisca, anche se probabilmente sarà così nella pratica. –
CodesInChaos
Non è nel CF, che è il motivo principale per cui lo chiedo. Controllare le icone del costruttore sul MSDN è come di solito dico se è lì o no (confronta le icone del costruttore di '' HashSet 'a' Elenco 's (che è supportato). –
' HashSet 'non sembra essere a parte il framework compatto –
SomeWritesReserved