簡體   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