【发布时间】:2012-08-06 21:55:47
【问题描述】:
除了this quite old post,我还需要一些可以使用原语并为包含大量HashSets 或Integers 的应用程序提供加速的东西:
Set<Integer> set = new HashSet<Integer>();
所以人们会提到像 Guava、Javalution、Trove 这样的库,但是在基准测试和性能结果方面并没有完美的比较,或者至少是来自良好经验的好答案。我看到很多人推荐Trove的TIntHashSet,但也有人说它不是那么好;有人说 Guava 超酷且易于管理,但我不需要美观和可维护性,只需要时间执行,所以 Python 风格的 Guava 就回家了 :) Javalution?我访问过该网站,对我来说似乎太旧了,因此很古怪。
库应该提供最佳的可实现时间,内存无关紧要。
查看“Thinking in Java”,有一个想法是使用int[] 作为键创建自定义HashMap。所以我希望看到与HashSet 类似的东西,或者直接下载并使用一个很棒的库。
EDIT(回应下面的cmets)
所以在我的项目中,我从大约 50 个 HashSet<Integer> 集合开始,然后我调用一个函数大约 1000 次,内部创建多达 10 个 HashSet<Integer> 集合。如果我更改初始参数,数字可能会呈指数增长。我只对这些集合使用add()、contains() 和clear() 方法,这就是选择它们的原因。
现在我将找到一个实现HashSet 或类似功能的库,但由于自动装箱Integer 开销以及可能我不知道的其他东西,它会更快地完成。事实上,当我的数据进来时,我使用整数并将它们存储在那些HashSets 中。
【问题讨论】:
-
我们对您的项目了解不足,无法为您拨打这个电话。大多数项目都可以毫无问题地使用
Set<Integer>。我建议你试试你提到的库并衡量你的表现。 -
如果您要映射的范围很大,我建议不要使用位设置。正如@JimGarrison 所说,[
Integer.MIN_VALUE,Integer.MAX_VALUE] 将占用(根据WolframAlpha)512 MiB 使用位设置。 -
如果您正在研究为整数选择哈希表的特定底层实现,请知道,由于元素很小并且可以放入缓存行,您可以查看 open -寻址而不是单独的链接。然而,在这个阶段这可能是premature optimization。
-
整个问题似乎是过早的优化。
-
不能自己写HashSet吗?这并不难。
标签: java performance hashset