Java 在代码中多次访问同一属性(对象的成员)

Java 在代码中多次访问同一属性(对象的成员),java,optimization,Java,Optimization,非常简单的问题,我有一个对象(比如Obj),它有一个成员变量(比如“var”)。在一个函数中,我需要多次访问此属性(4到5次)。我现在所做的就是每次执行Obj.var来获取值。从优化的角度来看,这样做是正确的,还是我应该将Obj.var存储在一个临时变量中,然后使用这个变量?我想从“两种方法如何影响性能”的角度进行解释 ===== 如果Obj.var被Obj.getVar()替换,该变量的getter方法会怎么样?它将如何影响性能?这取决于字段的类型(“Obj.var”): 如果是基元类型(i

非常简单的问题,我有一个对象(比如Obj),它有一个成员变量(比如“var”)。在一个函数中,我需要多次访问此属性(4到5次)。我现在所做的就是每次执行Obj.var来获取值。从优化的角度来看,这样做是正确的,还是我应该将Obj.var存储在一个临时变量中,然后使用这个变量?我想从“两种方法如何影响性能”的角度进行解释

=====


如果Obj.var被Obj.getVar()替换,该变量的getter方法会怎么样?它将如何影响性能?

这取决于字段的类型(“Obj.var”):

  • 如果是基元类型(
    int
    float
    char
    等),您可能看不到任何性能影响(因为基元类型很小:
    long
    double

  • 如果它是一个对象本身(包括原语数组),将其分配给局部变量不会有任何改进,因为分配的是对该对象的引用,因此通过访问局部副本,您实际上将访问原始对象(Obj.var)。说到本地副本,有一种方法可以通过克隆该变量(如果Obj.var类型支持的话)来创建“真实”本地副本(即独立于原始对象Obj.var的副本,而不仅仅是对同一对象的另一个引用)。但这样做可能会降低性能,而不是获得一点性能(如果有的话):除了访问对象的所有费用(在任何情况下都由您支付)之外,您还将支付将对象克隆(复制)到本地范围的费用


除非变量是volatile,否则JITC可以自由执行任何它想做的事情,只要它能证明您在此期间没有覆盖字段(如果没有volatile,它就不关心其他线程做什么)

如果你不使用局部变量,它会帮你。它也可以用另一种方式来做,但我几乎无法想象任何情况下它是有意义的(它可以,当寄存器用完时)

因此,性能(*)并不重要,但就可读性而言,本地版本几乎总是更好的,所以就去做吧



(*)在Android上,情况可能会有所不同,因为它没有服务器类JVM那么聪明。

两者都不“正确”。两者都可以。两者都是有效的重构:;你是否在一个函数中获得该属性4-5次?可能重复:@blitz:是的,我引用它超过4次。克隆部分有点混乱。