最快的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

上一篇: Fastest Java HashSet<Integer> library

下一篇: Search for and view a file deleted from the repo