有两个性能方面:从给定数组构造集合的时间和获得下一个不包含值的时间。
此外,还有内存使用方面 - 如果您有数千个这样的独立集合,您可能希望集合数据结构消耗尽可能少的内存。(但我想这不是你的情况。)
最后,未包含值的典型数量很重要。我测试了 2 种情况:使用了一半的值,使用了 99% 的值。
我对 3 个解决方案进行了基准测试:您的原始布尔数组、bitSet 和 HashSet。
https://gist.github.com/leventov/6749728
结果:
Benchmark Mean Units
construction_bitSet_05_load 19,184 usec/op
construction_bitSet_099_load 38,319 usec/op
construction_booleanArray_05_load 7,987 usec/op
construction_booleanArray_099_load 16,255 usec/op
construction_complementHashSet_05_load 859,151 usec/op
construction_complementHashSet_099_load 923,588 usec/op
construction_hashSet_05_load 262,920 usec/op
construction_hashSet_099_load 441,306 usec/op
nextIndex_bitSet_05_load 2,086 nsec/op
nextIndex_bitSet_099_load 2,147 nsec/op
nextIndex_booleanArray_05_load 9,264 nsec/op
nextIndex_booleanArray_099_load 65,424 nsec/op
nextIndex_complementHashSet_05_load 27,298 nsec/op
nextIndex_complementHashSet_099_load 142,565 nsec/op
nextIndex_hashSet_05_load 27,159 nsec/op
nextIndex_hashSet_099_load 1948,120 nsec/op
(Complement HashSet 在 99% 的负载情况下比 ordinal 更快,但在创建时非常期待。)
正如我个人预期的那样,您的原始解决方案在集合构造上最快,而 BitSet 在下一个未包含的值检索中最快。
内存消耗:
boolean[]
: 14000 字节。
BitSet
: 1750 字节(每 8 个可能值 1 个字节)
HashSet
: ~= 每个包含值 62 字节(~= 38 字节,-XX:+UseCompressedOops
)
- 补充
HashSet
:类似地每个未包含的值。