繁体   English   中英

Java静态/实例方法优化

[英]Java Static/Instance method optimization

在Java中未修改方法变量,缺少了final ,预选赛重新初始化在每次

  1. 静态方法
  2. 实例方法

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

如果答案取决于变量的类型,则优化/未优化哪种类型的变量? 例如, Stringint优化而Map未优化?

为了进行比较,Java将仅存储静态类变量,例如

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实例。

*优化-JIT编译器可以内联这些值,因此每种解决方案的运行速度都可以与另一种完全一样。 因此,除非您意识到实际的性能问题,否则不要尝试微优化自己。

在Java中是未修改的方法变量,它们每次都缺少最终的限定符重新初始化

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

我认为您真正想问的是,可以某种方式优化此初始化吗? 如果为变量分配了常量值,则为是;否则,为0。 JIT编译器可能会完全删除该变量,并用其(已知常量)值替换对其的引用。

最终限定符是否将允许Java执行优化并只将方法变量存储一次?

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

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

该值在程序执行期间不能仅分配一次,因为每次调用该方法都不同。

局部变量的final修饰符对优化几乎没有或没有直接影响。 它仅对变量可以执行的操作施加了限制-任何变量都可以遵循这些限制,而与final限定无关,而这又允许进行某些优化。 如果优化程序是值得的,那么它不会在乎该变量是否声明为final ,而是会考虑其是否有效地保持不变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM