6

除了这篇相当老的帖子之外,我还需要一些可以使用原语并为包含大量HashSets 的应用程序提供加速的东西Integers

Set<Integer> set = new HashSet<Integer>();

所以人们提到像 Guava、Javalution、Trove 这样的库,但是在基准和性能结果方面并没有完美的比较,或者至少是来自良好经验的好答案。从我看到的很多人推荐 Trove's TIntHashSet,但也有人说它不是那么好;有人说 Guava 超酷且易于管理,但我不需要美观和可维护性,只需要时间执行,所以 Python 的风格 Guava 就回家了 :) Javalution?我访问过该网站,对我来说似乎太旧了,因此很古怪。

图书馆应该提供最佳的可实现时间,内存无关紧要。

查看“Thinking in Java”,有一个想法是HashMap使用int[]as 键创建自定义。所以我想看到类似的东西,HashSet或者只是下载并使用一个很棒的库。

编辑(回应下面的评论)所以在我的项目中,我从大约 50 个HashSet<Integer>集合开始,然后我调用一个函数大约 1000 次,内部创建多达 10 个HashSet<Integer>集合。如果我更改初始参数,数字可能会呈指数增长。我只在这些集合上使用add(),contains()clear()方法,这就是选择它们的原因。

现在我要找到一个实现HashSet或类似的库,但由于自动装箱Integer开销和其他我不知道的东西,它会更快地完成。事实上,当我的数据进入并将它们存储在那些HashSets 中时,我正在使用整数。

4

3 回答 3

4

Trove 是一个很好的选择。

它比通用集合快得多的原因是内存使用。

A在内部java.util.HashSet<Integer>使用 a java.util.HashMap<Integer, Integer>。在 aHashMap中,每个对象都包含在一个Entry<Integer, Integer>. 这些对象在实际哈希表中占用估计的 24 字节Entry+ 实际整数的 16 字节 + 4 字节。这产生了 44 个字节,与 Trove 中的 4 个字节相比,内存开销高达 11 倍(请注意,主表中未占用的整体将在实践中产生较小的差异)。

另见这些实验:

http://www.takipiblog.com/2014/01/23/java-scala-guava-and-trove-collections-how-much-can-they-hold/

于 2014-06-18T09:38:34.007 回答
2

看看Java 的高性能原始集合 (HPPC)。它是 trove 的替代品,成熟且为提高效率而精心设计。请参阅IntOpenHashSet的 JavaDoc 。

于 2014-06-18T12:54:52.417 回答
0

您是否尝试在创建 HashSet 时使用初始容量和负载因子参数?

哈希集文档

初始容量,如您所想,指的是空哈希集在创建时有多大,而负载因子是决定何时增长哈希表的阈值。通常您希望将已用桶与总桶的比率保持在三分之二以下,这被认为是在哈希表中实现良好稳定性能的最佳比率。

哈希表的动态调整

所以基本上,尝试设置一个适合您需要的初始容量(以避免在哈希表增长时重新创建和重新分配值),以及摆弄负载因子直到找到最佳位置。

对于您的特定数据分布和设置/获取值,较低的负载因子可能会有所帮助(几乎没有更高的负载因子,但您的里程可能会有所不同)。

于 2012-08-07T17:05:49.173 回答