java.util.HashMap有一个put方法的实现,它有the following code inside it:
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}在上面的代码中,为什么没有首先进行引用检查(因为具有相同引用的两个对象将具有相同的散列和equals())?
例如,类似于以下内容:
if ((k = e.key) == key) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
} else if ( compare hash and equals) {
// do something again with the value
}这不是可以保存一个比较吗?
发布于 2014-06-16 21:21:10
我不知道为什么,但一个天真的微基准测试表明,在Oracle的VM (Intel,32或64位)上,比较两个引用所需的时间大约是比较两个int(如在散列代码中)的时间的四倍。我会假设比较两个32位整数和两个地址指针在现代硬件上应该有类似的运行时成本,但我可能只是在这里没有考虑到一些显而易见的东西。
假设在大多数情况下,不同的键具有不同的散列码,比较键之前的散列可以为每个不正确的键节省75%的运行时间,并为正确的键增加25%的运行时间。这是否真的节省了整体运行时间当然取决于哈希表的确切内容和布局,但Sun工程师显然认为这个变体在大多数情况下都更好。
用于基准测试的方法:
public static int c1(int a, int b, int iter) {
int r = 0;
while((iter--)>0) {
if(a == b) {
r++;
}
}
return r;
}
public static int c2(Object a, Object b, int iter) {
int r = 0;
while((iter--)>0) {
if(a == b) {
r++;
}
}
return r;
}https://stackoverflow.com/questions/24243092
复制相似问题