Attualmente sto cercando di implementare vari algoritmi in un compilatore Just In Time (JIT). Molti degli algoritmi operano su bitmap, più comunemente noti come bitset.Quale implementazione di bitset dovrei usare per le massime prestazioni?
In C++ esistono vari modi per implementare un set di bit. Come vero sviluppatore C++, preferirei usare qualcosa da STL. L'aspetto più importante è la performance. Non ho necessariamente bisogno di un set di bit ridimensionabile in modo dinamico.
Come vedo, ci sono tre opzioni possibili.
I. Un'opzione sarebbe quella di utilizzare std::vector<bool>
, che è stato ottimizzato per lo spazio. Ciò indicherebbe anche che i dati non devono essere contigui in memoria. Immagino che questo potrebbe ridurre le prestazioni. D'altra parte, avere un bit per ogni valore bool potrebbe migliorare la velocità dato che è molto cache friendly.
II. Un'altra opzione sarebbe quella di utilizzare invece un std::vector<char>
. Garantisce che i dati siano contigui in memoria ed è più facile accedere ai singoli elementi. Tuttavia, sembra strano usare questa opzione poiché non è destinata a essere un bitset.
III. La terza opzione sarebbe quella di utilizzare l'attuale std::bitset
. Il fatto che non sia ridimensionabile dinamicamente non ha importanza.
Quale scegliere per le massime prestazioni?
Benchmark! [Relativo.] (Http://www.youtube.com/watch?v=wg4trPZFUwc) –
C'è anche [Boost.Dynamic Bitset] (http://www.boost.org/doc/libs/1_50_0/libs/ dynamic_bitset/dynamic_bitset.html) da considerare. Ma seriamente non c'è davvero modo di dire quali prestazioni hanno le migliori prestazioni senza conoscere il modello di utilizzo. Ad esempio: se la tua collezione è piccola e spesso si accede a 'vector' potrebbe darti accesso più veloce dei bitset, a causa del non dover fare bitshifting/masking. Tuttavia, quando meno frequenti/maggiori sono le dimensioni di cache mancanti a causa dell'impronta di memoria più grande, molto probabilmente uccideranno tale beneficio. –
Grizzly
Rischio di indicare qualcosa di ovvio: lo std :: bitset è allocato nello stack ed è quindi abbastanza limitato nella dimensione massima nella maggior parte dei casi. Tuttavia, non so nulla della quantità di dati che è necessario memorizzare. – identity