Java静态/实例方法优化

Java静态/实例方法优化,java,optimization,static,jvm,final,Java,Optimization,Static,Jvm,Final,在Java中,是未修改的方法变量,缺少final, 限定符每次在 静态法 实例方法 如果答案是1。或2.,(或两者)将是最终限定符 允许Java执行优化并存储该方法 变量只有一次 如果答案取决于变量的类型,那么 变量是否已优化/未优化?例如,isString, int优化而Map未优化 为了进行比较,Java只存储一个静态类变量 比如 一次。澄清:问题在于是否 1: static SomeReturnValueOrVoid SomeMethod() { // 1.a Not modifi

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

  • 静态法
  • 实例方法
  • 如果答案是1。或2.,(或两者)将是
    最终限定符
    允许Java执行优化并存储该方法
    变量只有一次

    如果答案取决于变量的类型,那么 变量是否已优化/未优化?例如,is
    String
    int
    优化而
    Map
    未优化

    为了进行比较,Java只存储一个静态类变量 比如

    一次。澄清:问题在于是否

    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"; 
    }
    
    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"; 
    }
    
    class SomeClass {
        static final String foo = "Teenage Mutant Ninja Turtle";
    
        SomeReturnValueOrVoid SomeMethod() {
            // Uses foo
        }
    
        static SomeReturnValueOrVoid SomeMethod() {
            // Uses foo
        }
    
        ...
    }
    
    2:

    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"; 
    }
    
    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"; 
    }
    
    class SomeClass {
        static final String foo = "Teenage Mutant Ninja Turtle";
    
        SomeReturnValueOrVoid SomeMethod() {
            // Uses foo
        }
    
        static SomeReturnValueOrVoid SomeMethod() {
            // Uses foo
        }
    
        ...
    }
    
    相当于

    3:

    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"; 
    }
    
    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"; 
    }
    
    class SomeClass {
        static final String foo = "Teenage Mutant Ninja Turtle";
    
        SomeReturnValueOrVoid SomeMethod() {
            // Uses foo
        }
    
        static SomeReturnValueOrVoid SomeMethod() {
            // Uses foo
        }
    
        ...
    }
    

    无论是
    静态
    方法还是
    最终
    变量或两者都没有区别。局部变量的范围意味着每次分配都会发生(优化时除外*)

    但是,对于示例中的字符串,字符串将来自。因此,赋值每次都会发生,但它们都会引用相同的
    字符串
    实例


    *优化-可能会将值内联,因此每个解决方案的运行速度可能与另一个解决方案的运行速度完全相同。因此,除非您意识到实际的性能问题,否则您不应该尝试对自己进行微优化。

    无论是
    静态方法还是
    最终变量或两者都没有区别。局部变量的范围意味着每次分配都会发生(优化时除外*)

    但是,对于示例中的字符串,字符串将来自。因此,赋值每次都会发生,但它们都会引用相同的
    字符串
    实例

    *优化-可能会将值内联,因此每个解决方案的运行速度可能与另一个解决方案的运行速度完全相同。因此,除非您意识到实际的性能问题,否则不应该尝试对自己进行微优化

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

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

    我想你真正想问的是,这个初始化能以某种方式优化吗?如果为变量指定了一个常数值,则为“是”;JIT编译器可能会完全删除该变量,并用其(已知常量)值替换对该变量的引用

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

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

    void someMethod()
    {
       final int number = new Random().nextInt();
    }
    
    在程序执行期间,该值不能只分配一次,因为每次调用该方法时该值都不同

    局部变量的
    final
    修饰符对优化几乎没有直接影响。它仅对变量的操作设置了限制-任何变量都可能遵循这些限制,无论
    最终
    资格如何-这反过来允许某些优化。如果优化器值它的盐,它就不会关心变量是否被声明为代码>最终< /代码>,而是考虑它是否是有效的。
    在Java中是未修改的方法变量,它们缺少最终的限定符,每次都重新初始化

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

    我想你真正想问的是,这个初始化能以某种方式优化吗?如果为变量指定了一个常数值,则为“是”;JIT编译器可能会完全删除该变量,并用其(已知常量)值替换对该变量的引用

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

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

    void someMethod()
    {
       final int number = new Random().nextInt();
    }
    
    在程序执行期间,该值不能只分配一次,因为每次调用该方法时该值都不同


    局部变量的
    final
    修饰符对优化几乎没有直接影响。它仅对变量的操作设置了限制-任何变量都可能遵循这些限制,无论
    最终
    资格如何-这反过来允许某些优化。如果优化器值它的盐,它将不关心变量是否被声明为代码>最终< /代码>,而不是考虑它是否有效。在编译和其他类型中,

    字符串常量在< <代码>字符串< /代码>中被解决,例如<代码> MAP>代码>,它们如何在这个上下文中处理?如果在方法中创建新的映射,不管它是最终的还是非最终的,它每次都会被创建。@FilipAllberg我建议您仔细阅读。字符串常量在编译过程中会被解析,而其他类型的字符串(而不是
    String
    )如
    Map
    ),它们在这个上下文中是如何处理的?如果您在一个方法中创建了一个新的映射,无论它是最终的还是非最终的,每次都会创建它。@Filipollberg我建议您通过。当然!现在它点击了。我应该完全从方法变量是线程安全的这一事实中认识到这一点。@FilipAllberg和其他变量,JIT并不关心。除非您声明一个变量
    volatile
    ,或者执行强制它们同步的操作,否则编译器可以自由地假设没有其他线程修改任何变量。它可以随意避免冗余负载和存储。Th