【发布时间】:2016-12-03 00:53:24
【问题描述】:
我受到这个话题的启发:Performance and Memory allocation comparision between List and Set 实际运行一些测试并测量ArrayList 和HashSet 之间的性能差异。
在提到的主题中,最让我感兴趣的答案 (link) 说:
对于相同数量的元素,HashSet 消耗的内存大约是 ArrayList 的 5.5 倍
在ScalaMeter 的帮助下,我想确认一下。
我做了两个简单的测试,将10000 到100000 元素添加到ArrayList 和HashSet。 将初始大小设置为最大值并没有改变结果。我用两种类型测试了这些集合:
-
Int(将连续数字 0 到 100000) -
String(使用 ApacheRandomStringUtils放置随机字符串)
代码在我的存储库here 中可用。
运行这些,给了我这个结果:
- X 轴 - 大小 -> 集合的大小
- Y 轴 - 值 -> 使用的 kB 量
问题:
引用答案中提到的理论发生了什么?是假的吗?或者我这边可能有什么错误?
谢谢:)!
@andrzej 回答后更新 我再次更新了代码(和存储库)。结果越来越好,但结果仍然没有 5.5 倍不同。我现在正在检查更多内容。
【问题讨论】:
-
你是如何构建这些元素的?您是否保证它们彼此不同?
-
@JFMeier 请查看更新(并检查 github 上的代码 :-))
-
您的结果看起来正确。 5.5 是与集合结构开销相关的理论速率,它没有考虑对象大小。物体越大,这个比率就越低,你的测试表明了这一点。让你的字符串长度为 50 个字符而不是 10 个字符,数组和集合之间的差异会更小。
-
@AndrewLygin 我添加了 50 个字符长字符串的图表。看来您是对的,我会尝试做一些数学计算并计算尺寸。
标签: java scala collections performance-testing scalameter