相关疑难解决方法(0)

在Java中内联

在C++中,我可以声明一个方法"内联",编译器可能会内联它.据我所知,Java中没有这样的关键字.

如果JVM决定这样做,内联就完成了吗?我能以某种方式影响这个决定吗?

java jvm inline-method inlining

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

访问最终局部变量比Java中的类变量更快吗?

我一直在寻找一些Java基本集合(的宝库,fastutil,HPPC)和我已经注意到,类变量有时声明为图案final的局部变量.例如:

public void forEach(IntIntProcedure p) {
    final boolean[] used = this.used;
    final int[] key = this.key;
    final int[] value = this.value;
    for (int i = 0; i < used.length; i++) {
        if (used[i]) {
          p.apply(key[i],value[i]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经完成了一些基准测试,看起来这样做会快一点,但为什么会这样呢?我试图理解如果函数的前三行被注释掉,Java将采取哪些不同的做法.

注意:这似乎与这个问题类似,但这是针对c ++的,并没有说明它们被声明的原因final.

java optimization micro-optimization

14
推荐指数
2
解决办法
5412
查看次数

Sun的HotSpot JIT编译器是否自动将"final"应用于Java局部变量?

我听说是这种情况,但我找不到确定的在线资源来确认.

背景:一位同事喜欢制作他的局部变量final.他这样做的原因之一是表现.我的论点是,Java的HotSpot Just In Time编译器会自动检测不变的局部变量并制作它们final,所以自己做这个没有性能上的好处.

请注意,我不是在问局部变量是否是一个好的编码实践final,因为已经有很多(非主题)SO问题.

编辑:mrhobo为优化整数文字的字节码提出了一个很好的观点.我应该给出一个我正在谈论的代码类型的例子,我的问题是:

Object doSomething(Foo foo) {
    if (foo == null) {
        return null;
    }

    final Bar bar = foo.getBar();
    final Baz baz = this.bazMap.get(bar);

    return new MyObject(bar, baz);
}
Run Code Online (Sandbox Code Playgroud)

您是否认为在这种情况下会发生相同类型的优化,因为bar并且baz都标记了final?或者,HotSpot会自动检测到它们是否在方法范围内没有变化,并将它们视为final无论如何?

类似的问题

java jit jvm-hotspot

7
推荐指数
1
解决办法
556
查看次数