簡體   English   中英

具有類似性能的數組的 Java Bitset 的替代方案?

[英]Alternative to Java Bitset with array like performance?

我正在尋找 Java Bitset 實現的替代方案。 我正在實現一種高性能算法,似乎使用 Bitset 對象正在扼殺其性能。 有任何想法嗎?

這里有人將boolean[]BitSet並得出結論:

除了非常小的尺寸外, BitSetboolean[]內存效率更高。 數組中的每個boolean都占用一個字節。 來自runtime.freeMemory()的數字對於BitSet有點混亂,但更少。

boolean[]的 CPU 效率更高,除了非常大的尺寸,它們大約是均勻的。 例如,對於大小為 100 萬的boolean[]大約快四倍(例如 6ms 與 27ms),對於 10 和 1 億,它們大約是偶數。

如果您使用 Google,您也可以找到一些替代實現,例如JavaEWAH ,由Apache HiveApache SparkEclipse JGit 使用 它聲稱:

字對齊壓縮的目標不是實現最佳壓縮,而是提高查詢處理時間。 因此,我們嘗試節省 CPU 周期,可能以存儲為代價。 然而,我們實現的 EWAH 方案在存儲方面總是比 BitSet 類中實現的未壓縮位圖更有效)。 與某些替代方案不同,javaewah 不依賴於專利方案。

在為我的問題單字節比較與多布爾比較搜索答案時,我發現了OpenBitSet

他們聲稱比 Java BitSet 更快,並且可以直接訪問存儲位的字數組。

我肯定會嘗試的。 看看它是否也解決了你的目的。

看看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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM