最快的Java HashSet <Integer>库
除了这个相当古老的帖子之外,我还需要一些使用原语的应用程序,并为包含大量Integers
HashSet
的应用程序加速:
Set<Integer> set = new HashSet<Integer>();
因此,人们提到像Guava,Javalution,Trove这样的图书馆,但是在基准和表现结果方面没有完美的比较,或者至少从良好的经验中得到了很好的答案。 从我看到的很多推荐Trove的TIntHashSet
,但其他人都说这不是很好; 有人说番石榴是超级冷却和可管理的,但我不需要美观和可维护性,只有时间执行,所以Python的风格番石榴回家:) Javalution? 我访问过这个网站,对我来说太老了,因此太古怪了。
图书馆应该提供最好的实现时间,记忆并不重要。
看一下“Thinking in Java”,有一个想法,用int[]
作为键创建自定义HashMap
。 所以我希望看到类似于HashSet
东西,或者只需下载并使用一个惊人的库。
编辑 (回应下面的评论)因此,在我的项目中,我从大约50个HashSet<Integer>
集合开始,然后我调用大约1000次的函数,最多创建10个HashSet<Integer>
集合。 如果我改变初始参数,数字可能会呈指数级增长。 我只在这些集合上使用add()
, contains()
和clear()
方法,这就是它们被选中的原因。
现在我要找到一个实现HashSet
或类似的库,但由于自动装箱的Integer
开销和其他我不知道的其他东西,会更快地完成此操作。 实际上,当我的数据进入并将它们存储在这些HashSet
,我正在使用整数。
您是否在创建HashSet时尝试使用初始容量和加载因子参数?
HashSet文档
您可能会认为初始容量是指创建时空的哈希集有多大,负载因子是决定何时生成哈希表的阈值。 通常情况下,您希望将使用的存储桶和总存储桶之间的比率保持在三分之二以下,这被认为是在散列表中实现良好稳定性能的最佳比率。
动态调整哈希表
所以基本上,尝试设置一个适合您需要的初始容量(以避免在哈希表增长时重新创建和重新分配哈希表的值),以及摆弄负载因子,直到找到最佳位置。
这可能是因为您的特定数据分布和设置/获取值,较低的负载因子可能会有所帮助(几乎不会有更高的因子,但您的milage可能会有所不同)。
Trove是一个很好的选择。
内存使用的原因是它比通用集合要快得多。
java.util.HashSet<Integer>
在内部使用java.util.HashMap<Integer, Integer>
。 在HashMap
,每个对象都包含在Entry<Integer, Integer>
。 这些对象在实际哈希表中估计24个字节用于实际整数+ 4字节的Entry
字节。 这产生了44个字节,而不是Trove中的4个字节,最高可达11倍的内存开销(请注意,主表中未占用的内存将在实践中产生较小的差异)。
另请参阅这些实验:
http://www.takipiblog.com/2014/01/23/java-scala-guava-and-trove-collections-how-much-can-they-hold/
看看Java的高性能原始集合(HPPC)。 这是替代trove,成熟和精心设计的效率。 请参阅JavaDoc以了解IntOpenHashSet。
链接地址: http://www.djcxy.com/p/62345.html