繁体   English   中英

最快的Java HashSet <Integer> 图书馆

[英]Fastest Java HashSet<Integer> library

除了这篇相当老的文章之外 ,我还需要一些将使用原语并为包含很多HashSetIntegers的应用程序加速的方法:

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

因此,人们提到了诸如Guava,Javalution,Trove之类的库,但是就基准和性能结果而言,它们之间没有完美的比较,或者至少从良好的经验中获得了良好的答案。 从我看来,很多人都推荐Trove的TIntHashSet ,但是其他人则说那不是那么好。 有人说Guava是超酷且易于管理的,但我不需要美观和可维护性,只需要时间执行即可,因此Python风格的Guava可以归位了:) Javalution? 我访问过该网站,对于我来说似乎太老了,因此古怪。

该库应提供最佳可实现时间,内存无所谓。

看“用Java思考”,有一个想法是使用int[]作为键来创建自定义HashMap 因此,我希望看到与HashSet类似的东西,或者只是下载并使用一个令人惊叹的库。

编辑 (响应下面的评论),所以在我的项目,我从50开始HashSet<Integer>集合,那么我所说的约1000倍函数内创建多达10个HashSet<Integer>集合。 如果更改初始参数,数字可能会成倍增长。 我只在这些集合上使用add()contains()clear()方法,这就是为什么选择它们的原因。

现在,我将找到一个实现HashSet或类似功能的库,但是由于自动装箱Integer开销以及其他我不知道的东西,它会更快地实现。 实际上,我在输入数据时使用的是整数,并将它们存储在这些HashSet

Trove是一个很好的选择。

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

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

另请参阅以下实验:

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

看一下Java的高性能基元集合(HPPC) 它是替代,成熟和精心设计以提高效率的替代方法。 有关IntOpenHashSet的信息,请参见JavaDoc。

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

哈希集文档

您可能会想到,初始容量是指创建空哈希集时的大小,而loadfactor是确定何时增长哈希表的阈值。 通常,您希望将已使用的存储桶与总存储桶之间的比率保持在三分之二以下,这被认为是在哈希表中实现良好稳定性能的最佳比率。

动态调整哈希表

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

可能对于您的特定数据分配和设置/获取值而言,较低的负载系数可能会有所帮助(几乎不会有较高的负载系数,但是您的里程可能会有所不同)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM