Mam następujący problem. Mam grę, która działa średnio 60 klatek na sekundę. Każda klatka potrzebna do przechowywania wartości w kontenerze i nie może być żadnych duplikatów.Jaki kontener przechowywać wartości unikatowe?
Prawdopodobnie musi przechowywać mniej niż 100 elementów na ramkę, ale liczba wstawionych wywołań będzie o wiele większa (a wiele odrzuconych z powodu tego musi być unikatowych). Tylko na końcu ramy muszę przejść przez pojemnik. A więc około 60 iteracji kontenera na ramkę, ale o wiele więcej wstawek.
Należy pamiętać, że pozycje do zapisania to prosta liczba całkowita.
Istnieje kilka pojemników, które mogę wykorzystać do tego, ale nie mogę zdecydować, co wybrać. Najważniejszą kwestią jest wydajność.
Niektóre plusy/minusy, że zebraliśmy:
wektorowe
- (PRO): pamięć Contigous, ogromny czynnik.
- (PRO): Pamięć może być zarezerwowana jako pierwsza, bardzo niewiele alokacji/deallocations następnie
- (CON): Nie ma alternatywy, aby przejść kontener (std :: find) do każdej wkładki(), aby znaleźć unikalne klucze? Porównanie jest proste, choć (liczby całkowite), a cały pojemnik może prawdopodobnie pasuje cache
ustawiony zostanie
- (PRO): Prosty, wyraźnie przeznaczone do tego
- (CON): Nie stały czas wstawiania
- (CON): Wiele alokacji/deallokacji na ramkę
- (CON): Nie jest to pamięć ciągła. Przemierzanie zestawu setek obiektów oznacza skakanie dookoła w pamięci.
unordered_set
- (PRO): Prosty, wyraźnie przeznaczone do tego
- (PRO): Średnie sprawa stała czasowa wstawić
- (Con): Widząc, jak przechowywać liczby całkowite, operacja mieszania jest prawdopodobnie o wiele droższa niż cokolwiek innego:
- (CON): wiele alokacji/deallocations na ramkę
- (CON): Not contigous memory. Przemierzanie zestawu setek obiektów oznacza skakanie dookoła w pamięci.
ja opierając się dzieje z Vector-trasę z powodu wzorców dostępu do pamięci, mimo że zestaw jest wyraźnie przeznaczona na ten temat. Największym problemem, który jest dla mnie niejasny, jest to, czy przemieszczenie wektora dla każdej wstawki jest droższe niż alokacje/deallokacje (szczególnie biorąc pod uwagę, jak często musi to być zrobione) i sprawdzanie pamięci zestawu.
Wiem, że ostatecznie wszystko sprowadza się do profilowania każdego przypadku, ale jeśli nic innego, jak tylko headstart lub teoretycznie, co prawdopodobnie byłoby najlepsze w tym scenariuszu? Czy są jakieś plusy/minusy, które również mogłem ominąć?
EDIT: Ponieważ nie zrobił wspomnieć, pojemnik jest usuwany() na końcu każdej ramki
*** Wystarczy zmierzyć *** Biorąc pod uwagę, że jest 'unordered_set' ** ** Pakiet klasyczny "zestaw" pojemnik z nieuporządkowaną-no-semantyki i duplikatów najlepsza asymptotyczna złożoność, dałbym mu szansę, ale szanse na to, że "wektor" ją pokona dla małych rozmiarów kontenera, ponieważ ma znacznie lepsze właściwości lokalizacji pamięci podręcznej. –
Co z zapewnieniem własnego przydziału, który jest w stanie przezwyciężyć nieefektywne zarządzanie pamięcią? (np. dostarczanie puli obiektów) –
Niezależnie od tego, co robisz, postaraj się właściwie enkapsulować swój kod i użyj 'auto' do śledzenia typów, aby móc w łatwy sposób zmienić wybór kontenera w przyszłości. Następnie zmierz. –