相关疑难解决方法(0)

为什么hashCode比类似的方法慢?

通常,Java会根据给定调用端遇到的实现数量来优化虚拟调用.当你看一下,这可以很容易地在我的基准测试结果中看到,这是一个返回存储的简单方法.这是微不足道的myCodeint

static abstract class Base {
    abstract int myCode();
}
Run Code Online (Sandbox Code Playgroud)

与几个完全相同的实现

static class A extends Base {
    @Override int myCode() {
        return n;
    }
    @Override public int hashCode() {
        return n;
    }
    private final int n = nextInt();
}
Run Code Online (Sandbox Code Playgroud)

随着实现数量的增加,方法调用的时序从两个实现的0.4 ns增加到1.2 ns,再增长到11.6 ns,然后缓慢增长.当JVM看到多个实现时,preload=true即时序略有不同(因为instanceof需要进行测试).

到目前为止,一切都很清楚,但hashCode行为却相当不同.特别是,在三种情况下,它慢了8-10倍.知道为什么吗?

UPDATE

我很好奇,如果hashCode可以通过手动调度来帮助穷人,那可能会很多.

定时

几个分支完美地完成了这项工作:

if (o instanceof A) {
    result += ((A) o).hashCode();
} else if (o instanceof B) {
    result += ((B) o).hashCode(); …
Run Code Online (Sandbox Code Playgroud)

java performance hashcode

36
推荐指数
1
解决办法
2358
查看次数

标签 统计

hashcode ×1

java ×1

performance ×1