현재 JIT (Just In Time) 컴파일러에서 다양한 알고리즘을 구현하려고합니다. 대부분의 알고리즘은 비트 맵 (비트 맵)에서 작동합니다.최대 성능을 위해 어떤 비트셋 구현을 사용해야합니까?
C++에는 비트 셋을 구현하는 다양한 방법이 있습니다. 진정한 C++ 개발자로서 나는 STL에서 무언가를 사용하는 것을 선호한다. 가장 중요한 부분은 성능입니다. 반드시 동적으로 크기를 재조정 할 수있는 비트 셋이 필요하지는 않습니다.
내가보기에 세 가지 옵션이 있습니다.
I. 하나의 옵션은 공간 최적화 된 std::vector<bool>
을 사용하는 것입니다. 이것은 또한 데이터가 메모리에서 연속적 일 필요가 없음을 나타냅니다. 나는 이것이 성능을 떨어 뜨릴 수 있다고 생각한다. 반면에 각 bool 값에 대해 1 비트를 갖는 것은 매우 캐시 친화적이기 때문에 속도를 향상시킬 수 있습니다.
II. 또 다른 옵션은 std::vector<char>
을 대신 사용하는 것입니다. 데이터가 메모리에서 연속적이며 개별 요소에 액세스하는 것이 더 쉽습니다. 그러나이 옵션은 비트셋이 아니기 때문에 이상하게 느껴집니다.
III. 세 번째 옵션은 실제 std::bitset
을 사용하는 것입니다. 동적으로 크기를 조정할 수 없다는 사실은 중요하지 않습니다.
최대 성능을 위해 어느 것을 선택해야합니까?
벤치 마크! [관련.] (http://www.youtube.com/watch?v=wg4trPZFUwc) –
[Boost.Dynamic Bitset] (http://www.boost.org/doc/libs/1_50_0/libs/)도 있습니다. dynamic_bitset/dynamic_bitset.html)을 고려해야합니다. 하지만 실제로는 사용 패턴을 모른 채 어떤 성능이 가장 좋은 성능인지 알 수있는 방법이 없습니다. 예 : 컬렉션이 작고 자주 액세스하는 경우 '벡터'은 비트 시프트/마스킹을 수행 할 필요가 없으므로 비트 세트에 더 빨리 액세스 할 수 있습니다. 그러나 액세스 빈도가 적어 액세스 빈도가 낮을수록 캐시 누락이 많아지면 그 이점이 사라질 수 있습니다. –
Grizzly
무언가를 분명하게 지적 할 위험이 있습니다 : std :: bitset은 스택에 할당되므로 대부분의 경우 최대 크기가 상당히 제한됩니다. 그러나 저장해야하는 데이터의 양에 대해서는 알지 못합니다. – identity