[英]Alternative to Java Bitset with array like performance?
我正在尋找 Java Bitset 實現的替代方案。 我正在實現一種高性能算法,似乎使用 Bitset 對象正在扼殺其性能。 有任何想法嗎?
這里有人將boolean[]
與BitSet
並得出結論:
除了非常小的尺寸外,
BitSet
比boolean[]
內存效率更高。 數組中的每個boolean
都占用一個字節。 來自runtime.freeMemory()
的數字對於BitSet
有點混亂,但更少。
boolean[]
的 CPU 效率更高,除了非常大的尺寸,它們大約是均勻的。 例如,對於大小為 100 萬的boolean[]
大約快四倍(例如 6ms 與 27ms),對於 10 和 1 億,它們大約是偶數。
如果您使用 Google,您也可以找到一些替代實現,例如JavaEWAH ,由Apache Hive 、 Apache Spark和Eclipse JGit 使用。 它聲稱:
字對齊壓縮的目標不是實現最佳壓縮,而是提高查詢處理時間。 因此,我們嘗試節省 CPU 周期,可能以存儲為代價。 然而,我們實現的 EWAH 方案在存儲方面總是比 BitSet 類中實現的未壓縮位圖更有效)。 與某些替代方案不同,javaewah 不依賴於專利方案。
看看Javolution FastBitSet :與集合框架集成為一組索引的高性能位集,並遵守諸如 FastSet.size()(基數)或 FastCollection.equals(java.lang.Object) 等方法的集合語義(相同指數集)。
另請參閱http://code.google.com/p/guava-libraries/issues/detail?id=724#c3 。
BitSet 類有許多壓縮替代品。 已經提到了 EWAH ( https://github.com/lemire/javaewah )。 最近添加的內容包括 Apache Lucene、Apache Spark、Elastic Search 等使用的 Roaring 位圖 ( https://github.com/RoaringBitmap/RoaringBitmap )。
如果你真的必須從這件事中擠出最大的性能,如果內存無關緊要,你可以嘗試將每個標志存儲在一個整數中,其位大小等於 CPU 數據總線的寬度。
您可能使用的是 64 位數據總線 CPU,因此請嘗試使用長整數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.