Actualmente estoy tratando de implementar varios algoritmos en un compilador Just In Time (JIT). Muchos de los algoritmos operan en bitmaps, más comúnmente conocidos como bitsets.¿Qué implementación de conjunto de bits debería usar para obtener el máximo rendimiento?
En C++ hay varias formas de implementar un conjunto de bits. Como verdadero desarrollador de C++, preferiría usar algo de STL. El aspecto más importante es el rendimiento. No necesariamente necesito un conjunto de bits dinámicamente redimensionable.
Según lo veo, hay tres opciones posibles.
I. Una opción sería usar std::vector<bool>
, que ha sido optimizado para el espacio. Esto también indicaría que los datos no tienen que estar contiguos en la memoria. Supongo que esto podría disminuir el rendimiento. Por otro lado, tener un bit por cada valor de bool podría mejorar la velocidad, ya que es muy compatible con la caché.
II. Otra opción sería usar un std::vector<char>
en su lugar. Garantiza que los datos estén contiguos en la memoria y que sea más fácil acceder a elementos individuales. Sin embargo, se siente extraño utilizar esta opción, ya que no está destinado a ser un conjunto de bits.
III. La tercera opción sería usar el std::bitset
real. El hecho de que no sea redimensionable dinámicamente no importa.
¿Cuál debo elegir para obtener el máximo rendimiento?
Benchmark! [Relacionado.] (Http://www.youtube.com/watch?v=wg4trPZFUwc) –
También hay [Boost.Dynamic Bitset] (http://www.boost.org/doc/libs/1_50_0/libs/ dynamic_bitset/dynamic_bitset.html) a considerar. Pero en serio, realmente no hay forma de decir qué rendimiento tiene el mejor rendimiento sin conocer el patrón de uso. Por ejemplo: si su colección es pequeña y se accede a menudo, el vector 'podría proporcionarle un acceso más rápido que los conjuntos de bits, debido a que no tiene que hacer cambios de bits/enmascaramiento. Sin embargo, cuando se acceda a menos/más grande, la mayor cantidad de errores de caché debido a la mayor huella de memoria podría matar ese beneficio. –
Grizzly
A riesgo de señalar algo posiblemente obvio: std :: bitset está asignado en la pila y, por lo tanto, es bastante limitado en tamaño máximo en la mayoría de los casos. Sin embargo, no sé nada sobre la cantidad de datos que necesita almacenar. – identity