【发布时间】:2016-02-14 15:32:19
【问题描述】:
这是我的 HashMap 实现的 put() 方法。 100 000 个元素的运行时间约为 1500 毫秒,而Collections 的 HashMap 运行时间为 8 毫秒。
是什么让性能有如此大的差异?
(我的哈希函数只是基于 hashCode(),负载因子在 0.6 左右,所以它应该表现良好)
public boolean put(K key, V value)
{
if (size > cap*LOAD_FACTOR) expand();
int i;
for(i=hash(key);container[i] != null;i=(i+1) % cap)
{
if(container[i].key.equals(key))
{
container[i] = new Entry<K,V>(key,value);
return true;
}
}
container[i] = new Entry<K,V>(key,value);
size++;
return true;
【问题讨论】:
-
您是如何衡量这些数字的?如果你没有使用合适的基准测试工具,你可以把它们从阳台上扔掉。
-
控制台和
System.nanotime()与热身阶段:) -
您通常无法与 JVM 实现竞争。它们针对不同的类型、内存分配等进行了高度优化。一些容器直接与底层原生代码一起工作,这是纯 Java 实现无法实现的
-
Tunaki 是对的,有限数量的不可靠测试并不意味着什么
-
如果你事先知道条目的数量,你可以设置初始容量。不能解决根本原因,但可能已经足够好了,因为您从不展开()
标签: java performance hashmap