所有
我正在开发一个现有系统,开发人员定义了很多HashMaps
,其定义如下:
HashMap<String, Comparable> x = new HashMap<String, Comparable>();
现在,完全不需要对hashmap的value
部分进行比较,因为它只表示一条信息。开发人员使用Comparable
,因为唯一的期望值是String和int类型(转换为Integer对象),开发人员认为存储这两种数据类型的最佳方法是使用Comparable接口。
所以,我继续改变了代码,因为通过将HashMap定义为:
,这里没有任何比较点。 HashMap<String, Object> y = new HashMap<String, Object>();
我在更改之前和之后定时执行代码。关于为什么代码在部署更改后花费更多时间执行(虽然目前不是性能瓶颈),我感到有些惊讶。
有人可以帮我理解由于我的代码更新导致的行为变化吗?
答案 0 :(得分:4)
两者在性能方面完全相同,因为该值不用于散列(只有密钥)。
您如何计算代码?确保分别为每个测试用例计时。 不要执行以下操作,因为第二个测试将有第一个测试的好处,即“预热”JVM。我的猜测是你的测试有缺陷,或者你看到正常的执行时间变化。
public static void main(String[] args) {
for loop {
test HashMap<String, Comparable>
}
for loop {
test HashMap<String, Object>
}
}
答案 1 :(得分:2)
没有任何区别。类型信息在运行时被删除,因此可能问题出在其他地方。
答案 2 :(得分:0)
我的猜测是,除非你在其他地方做某些事情,这意味着性能下降(我认为没有理由为什么你应该看到你所提到的内容下降)是你正在使用的基准是有缺陷的。使用currentTimeMillis()
甚至nanoTime()
将不会考虑JIT预热,比其他操作更快地优化各种操作,或类似的任何操作 - 代码中的任何更改都可能以这种方式影响它。
我的建议是使用分析器来更真实地了解需要多长时间 - 如果使用该方法时显着更长,那么您可能会开始研究代码的问题。我只是担心,如果你依赖于琐碎的currentTimeMillis()
电话,你最终可能会试图找出实际上并不存在的性能问题(至少不是你认为的那些。)