Java Static/Instance 方法优化

Java Static/Instance method optimization

在Java中是未修改的方法变量,缺少final, 每次在 a

中重新初始化限定符
  1. 静态方法
  2. 实例方法

如果 1. 或 2.(或两者)的答案是 final 限定符 允许 Java 执行优化并存储方法 变量只有一次?

如果答案取决于变量的类型,那 变量是optimized/unoptimized?例如,是 Stringint 优化而 Map 未优化?

相比之下,Java 只会存储静态 class 变量 比如

private static final String foo = "Teenage Mutant Ninja Turtle";

一次。澄清一下:问题是是否

1:

static SomeReturnValueOrVoid SomeMethod() {
    // 1.a Not modified, is this reinitialized each method call?
    String foo = "Teenage Mutant Ninja Turtle";

    // 1.b Marked final, is this reinitialized each method call?
    final String bar = "Teenage Mutant Hero Turtle"; 
}

2:

SomeReturnValueOrVoid SomeMethod() { // not static
    // 2.a Not modified, is this reinitialized each method call?
    String foo = "Teenage Mutant Ninja Turtle";

    // 2.b Marked final, is this reinitialized each method call?
    final String bar = "Teenage Mutant Hero Turtle"; 
}

相当于

3:

class SomeClass {
    static final String foo = "Teenage Mutant Ninja Turtle";

    SomeReturnValueOrVoid SomeMethod() {
        // Uses foo
    }

    static SomeReturnValueOrVoid SomeMethod() {
        // Uses foo
    }

    ...
}

无论是 static 方法还是 final 变量或两者,都没有区别。局部变量的范围意味着每次都会发生这种赋值(除了优化*)。

但是,当涉及到您的示例中的字符串时,这些字符串将来自 string pool。所以分配每次都会发生,但它们都会引用相同的 string 实例。

*优化 - JIT compiler 可以内联值,因此每个解决方案可能 运行 与另一个解决方案一样快。因此,除非您意识到实际的性能问题,否则不应尝试对自己进行微优化。

In Java are unmodified method variables, that lack the final, qualifier re-initialized each time

(方法被调用)- 当然是,否则它们将未初始化。

我想你真正想问的是,这个初始化可以通过某种方式优化吗?如果变量被赋予一个常量值,那么是; JIT 编译器可能会完全删除变量,并用它的(已知常量)值替换对它的引用。

would the final qualifier allow Java to perform an optimization and store the method variable only once?

没有。 final 限定的局部变量不能更改其值,但方法的每次调用都有其自己的变量副本,并且不同的实例化可能对同一 final 变量使用不同的值。考虑:

void someMethod()
{
   final int number = new Random().nextInt();
}

不能在程序执行过程中只赋值一次,因为每次调用方法时都不一样

局部变量的final修饰符对优化几乎没有直接影响。它只对变量可以做什么进行限制 - 任何变量都可以遵循的限制,无论 final 资格如何 - 这反过来又允许进行某些优化。如果优化器物有所值,它不会关心变量是否声明为 final,而是会考虑它是否 有效 常量。