boolean[] vs BitSet: Qui est plus efficace?
Ce qui est plus efficace en termes de mémoire et de CPU à l'utilisation d'un tableau de boolean
s ou un BitSet? Spécifique BitSet méthodes ne sont pas utilisés, seul get/set/clear (==, =, Tableaux.remplir respectivement pour un tableau).
Vous devez vous connecter pour publier un commentaire.
À partir de quelques cas-tests avec Sun JDK 1.6 calcul des nombres premiers avec un tamis (le meilleur de 10 itérations pour se réchauffer, donner le compilateur JIT une chance, et d'exclure l'aléatoire de la planification des retards, Core 2 Duo T5600 1.83 GHz):
BitSet est plus efficace en terme de mémoire que boolean [], sauf pour de très petites tailles. Chaque booléenne dans le tableau prend un octet. Les chiffres de l'exécution.freeMemory() sont un peu confus pour BitSet, mais moins.
boolean[] est CPU plus efficace, sauf pour les très grandes tailles, où ils sont sur le même. E. g., pour la taille 1 million boolean[] est environ quatre fois plus rapide (par exemple, 6ms vs 27 ms est observée), pour la dizaine et une centaine de millions de dollars qu'ils sont sur le même.
BitSet
parce qu'il exprime l'intention, sauf si j'ai eu beaucoup de pistes relativement petits ensembles de bits et d'un besoin d'optimiser l'exécution.boolean[]
etBitSet
sont sur la même sur l'efficacité de l'UC? Il se sent commeboolean[]
devraient être toujours plus efficace.boolean[]
a été plus rapide, est d'environ la taille qui pourrait, de manière plausible, s'insèrent dans un cache.Boolean[]
utilise environ 4-20 octets par valeur booléenne.boolean[]
utilise environ 1 octet par valeur booléenne.BitSet
utilise environ 1 bit par valeur booléenne.La taille de la mémoire peut ne pas être un problème pour vous, auquel cas boolean[] peut-être plus simple de code.
Un peu à gauche-domaine de votre question, mais si le stockage est une préoccupation que vous pourriez rechercher en La compression de Huffman. Par exemple,
00000001
pourraient être réduits par la fréquence à quelque chose d'équivalent à{(7)0, (1)1}
. Un plus "randomisés" de la chaîne de00111010
nécessiterait une représentation plus complexe, par exemple{(2)0, (3)1, (1)0, (1)1, (1)0}
, et plus d'espace. Selon la structure de votre bits de données, vous pouvez obtenir une capacité de stockage de profiter de son utilisation, au-delà deBitSet
.Comme pour la mémoire, la documentation pour un
BitSet
a assez clair implications. En particulier:La source pour Java bibliothèque de classes est publiquement disponible et on peut facilement vérifier par eux-mêmes. En particulier:
Comme pour la vitesse; il dépend de ce que l'on est en train de faire. En général, ne pense pas à la vitesse de l'avance; utiliser n'importe quel outil qui fait le plus de sens du point de vue sémantique et conduit à la plus claire code. Optimiser seulement après avoir fait observer que les exigences de rendement ne sont pas remplies et identifier les goulots d'étranglement.
Venir ALORS et vous demande si Un est plus rapide que B est ridicule pour de nombreuses raisons, y compris, mais certainement pas limité à:
Je sais que c'est une vieille question, mais il est venu jusqu'à récemment; et je crois que cela vaut la peine d'ajouter.
Il dépend, comme toujours.
Oui BitSet est plus de la mémoire efficace, mais dès que vous avez besoin multithread accès boolean[] pourrait être le meilleur choix. Par exemple pour le calcul des nombres premiers, vous ne réglez le booléen à true et que, par conséquent, vous n'avez pas vraiment besoin de synchronisation. Hans Boehm a écrit un papier à ce sujet et la même technique peut être utilisée pour le marquage des nœuds dans le graphe.
Ici vous pouvez voir un Mémoire/Temps de référence en comparant une valeur de type boolean[][] trianguar matrice versus BitSet[] matrice triangulaire.
Que j'ai créer, définir et de lire le (taille * (taille-1) /2) valeurs et de comparer l'utilisation de la mémoire et de temps...
Espérons que cette aide...
Ici le code... (juste un quikly sale code de test, désolé 😉
Allant de Java à l'UC est totalement VM spécifiques. Par exemple, il a utilisé pour être que l'un booléen a été effectivement mis en œuvre comme une valeur de 32 bits (c'est probablement vrai à ce jour).
Sauf si vous savez qu'il va à la matière, vous êtes mieux de l'écriture du code pour être clair, profil, puis fixer les pièces qui sont lentes ou de consommer beaucoup de mémoire.
Vous pouvez faire ce que vous allez. Par exemple, une fois, j'ai décidé de ne pas appeler .stagiaire() sur les Cordes parce que quand j'ai couru le code dans le générateur de profils il ralentir trop (malgré utilisant moins de mémoire).
Je crois qu'un BitSet de mémoire et de CPU-efficace, c'est qu'elle peut à l'interne pack les bits en int, aspire, ou les types de données natifs, tandis qu'une valeur de type boolean[] nécessite un octet pour chaque bit de données. En outre, si vous étiez à utiliser les autres méthodes (et, ou, etc), vous constaterez que le BitSet est plus efficace, car il n'est pas nécessaire pour parcourir chaque élément d'un tableau; bit-à-bit de mathématiques est utilisé à la place.