Obecnie próbuję implementować różne algorytmy w kompilatorze Just In Time (JIT). Wiele algorytmów działa na mapach bitowych, bardziej znanych jako zestawy bitów.Którą implementację zestawu bitów należy użyć dla uzyskania maksymalnej wydajności?
W C++ istnieją różne sposoby implementacji bitsetu. Jako prawdziwy programista w C++, wolałbym użyć czegoś ze STL. Najważniejszym aspektem jest wydajność. Niekoniecznie potrzebuję dynamicznie skalowalnego bitsetu.
Jak widzę, istnieją trzy możliwe opcje.
I. Jedną opcją byłoby użycie std::vector<bool>
, która została zoptymalizowana pod kątem miejsca. Wskazuje to również, że dane nie muszą być ciągłe w pamięci. Myślę, że może to zmniejszyć wydajność. Z drugiej strony, posiadanie jednego bitu dla każdej wartości bool może poprawić szybkość, ponieważ jest bardzo przyjazne dla pamięci podręcznej.
II. Inną opcją byłoby zamiast tego użycie std::vector<char>
. Gwarantuje to, że dane są ciągłe w pamięci i łatwiej jest uzyskać dostęp do poszczególnych elementów. Jednak korzystanie z tej opcji jest dziwne, ponieważ nie ma być bitsetem.
III. Trzecią opcją byłoby użycie rzeczywistego std::bitset
. Fakt, że nie jest on dynamicznie skalowalny, nie ma znaczenia.
Który powinienem wybrać, aby uzyskać maksymalną wydajność?
Benchmark! [Powiązane.] (Http://www.youtube.com/watch?v=wg4trPZFUwc) –
Istnieje również [Bitowy bit bitow.Dynamiczny] (http://www.boost.org/doc/libs/1_50_0/libs/ dynamic_bitset/dynamic_bitset.html) do rozważenia. Ale tak naprawdę nie ma sposobu, aby stwierdzić, która wydajność ma najlepszą wydajność bez znajomości schematu użytkowania. Na przykład: jeśli twoja kolekcja jest mała i często uzyskiwany dostęp do 'wektora' może dać ci szybszy dostęp, niż zestawy bitów, ponieważ nie musisz robić bitshifting/maskowania. Jednak w przypadku mniejszej dostępności/większej większej liczby braków pamięci podręcznej ze względu na większy ślad pamięci może zabić tę korzyść. –
Grizzly
Na ryzyko wskazania czegoś, co jest ewidentne: std :: bitset jest przydzielany na stosie i w większości przypadków jest dość ograniczony w maksymalnym rozmiarze. Nie wiem jednak nic o ilości danych, które trzeba przechowywać. – identity