Alternative à Java Bitset avec la matrice de performance?
Je suis à la recherche d'une alternative à Java Bitset mise en œuvre. Je me suis mise en œuvre d'une haute performance de l'algorithme et semble à l'aide d'un Bitset objet est en train de tuer ses performances. Des idées?
- Pourriez-vous nous donner plus de détails sur les opérations de
BitSet
semblent tuer la performance? Un court extrait de code que vous profilé de manière à montrer sa lenteur serait l'idéal. - Votre question devrait plutôt être: "pourquoi est-ce bitset tuer de mes performances?" --et vous remarquerez que je suis déjà en train de vous un peu de crédit en ne suggérant qu'il devrait être "ce qui est en train de tuer mes performances ici?"
- Ainsi, une "alternative" peut-être quelque peu opérations sur les primitives (long, int, etc.) vous-même. Cependant, comme déjà indiqué devrait donner des détails sur vos objectifs et de la performance exacte du problème.
- Je considère l'ensemble du problème et d'essayer de supprimer la nécessité de créer un BitSet à tous. Pour ce faire j'aurais besoin d'une plus vaste de comprendre le problème que vous essayez de résoudre.
Vous devez vous connecter pour publier un commentaire.
Quelqu'un ici a comparé
boolean[]
àBitSet
et a conclu avec:Si vous Google, vous pouvez trouver quelques-uns des implémentations alternatives, comme JavaEWAH, utilisé par Apache Hive, Apache Spark et Eclipse JGit. Il affirme:
Lors de la recherche d'une réponse pour ma question seul octet comparaison vs plusieurs boolean comparaison, j'ai trouvé OpenBitSet
Ils prétendent être plus rapide que Java BitSet et un accès direct à l'ensemble des mots de stocker les bits.
Je suis définitivement vais essayer ça. Voir si il résoudre votre but.
Regarder Javolution FastBitSet :
Une haute performance bitset intégré au cadre de collecte comme un ensemble d'indices et d'obéir à la collection sémantique pour des méthodes telles que le réglage rapide.size() (cardinalité) ou FastCollection.equals(java.lang.Objet) (même ensemble d'indices).
Voir aussi http://code.google.com/p/guava-libraries/issues/detail?id=724#c3.
Si vous vraiment doit serrer le maximum de performance de cette chose, et si la mémoire n'est pas grave, vous pouvez essayer de stockage de chacun de vos drapeaux en un entier dont la taille en bits est égal à la largeur du bus de données de votre CPU.
Vous êtes probablement sur une version 64 bits du bus de données de la CPU, donc essayez d'entiers longs.
Il y a un certain nombre de comprimé de solutions de rechange à la classe BitSet. EWAH a déjà été mentionné (https://github.com/lemire/javaewah). Plus récents ajouts comprennent Rugissant bitmaps (https://github.com/RoaringBitmap/RoaringBitmap) qui sont utilisés par Apache Lucene, Apache Spark, Elastic Search, et ainsi de suite.