java - 使用静态全局变量或内联变量 - 哪个更有效?

标签 java static jit

我有一个关于 JIT 的问题(这个问题适合解决吗?)

例如,我有一个简单的数学任务要做,但我不知道哪种编程方法更好:

public class Spielwiese {

    static final BigDecimal STATIC_VALUE = new BigDecimal( "5" );

    public static BigDecimal doSomeCalculation1(BigDecimal bd) {
        return new BigDecimal("5").multiply( bd );
    }

    public static BigDecimal doSomeCalculation2(BigDecimal bd) {
        return STATIC_VALUE.multiply( bd );
    }
}

正在运行的 java 程序是否会看到 new BigDecimal("5") 指令实际上可以被静态用法替换? - 这可能会使 doSomeCalculation1(...) 更具可读性。

如果不是,那么一遍又一遍地重复实例化相同/相等值的其他原因是什么?

您个人是如何做到的?

我还能从哪里得到问题的答案?

最佳答案

这并不是一个真正的 JIT 问题。两个版本的代码之间的区别在于缓存的有效程度。

  • 在一个版本中,从长远来看,您会消耗更多空间,因为 STATIC_VALUESpielwiese 类(可能是应用程序)的生命周期内是可访问的。

  • 在另一个版本中,每次调用该方法时,您都会构造并丢弃一个额外的 BigDecimal 对象。

无论 JIT 编译如何,情况都会如此。

<小时/>

我会做什么?

首先,除非我的直觉告诉我性能可能很重要,否则我可能会针对可读性进行优化。从程序员生产力的角度来看,这种微观优化很少值得。

如果我需要针对频繁调用该方法的情况进行优化,则 STATIC_VALUE 方法(IMO)可能会更快一些。对静态变量的引用是单个字节码,并且可能会转换为单个机器指令。 (或者也许是两个)。构建新的 BigDecimal 值将需要更多数量级的指令。

如果我需要优化内存使用,那么哪个更好是有争议的。然而,这两种方法之间的差异可能很小,以至于很难实际测量。

<小时/>

Where else could I have gotten an answer to my question?

你可以自己得到答案:

  • 通过创建基准并进行衡量,或者
  • 通过使用输出 JIT 编译代码的 JVM 选项...并分析代码。

关于java - 使用静态全局变量或内联变量 - 哪个更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51962362/

相关文章:

java - 限制 Android 上列出的可用 WiFi 连接

java - 什么时候在 Java 中声明任何数据结构为静态?

jvm - 为什么 Math.sin() 委托(delegate)给 StrictMath.sin()?

c# - 执行引擎异常 : Attempting to JIT compile method 'System.Collections.Generic.Dictionary'

c# - 为什么代码大小对于 JIT 编译很重要?

java - 获取数组中项目的索引

java - Android Studio (1.5.1) -- 错误 : cannot find symbol class/App won't run

swift - 闭包和静态函数

c++ - 在声明它的方法内部初始化静态 std::multimap

java - 使用链表构建最小最大堆栈