非常简单的问题,我有一个对象(比如Obj),它有成员变量(比如“var”)。在一个函数中,我需要多次访问此属性(4到5次)。我现在正在做的是每次我做Obj.var来获得价值。是(从优化的角度来看)是这样做还是我应该将Obj.var存储在一个临时变量中然后使用这个变量?我正在寻找“两种方法如何影响绩效”观点的解释。
=====
如果Obj.var被Obj.getVar()替换,该变量的getter方法怎么办?它将如何影响性能?
答案 0 :(得分:3)
除非变量是volatile
,否则JITC可以自由地做任何想做的事情,只要它可以证明你在此期间没有覆盖该字段(没有volatile
,它没有'关心其他线程做什么。)
如果您不使用本地变量,它将为您执行此操作。它也可以用另一种方式来做,但我很难想象它有意义的任何情况(当你用完寄存器时它可能)。
所以它与性能(*)无关,但为了便于阅读,本地几乎总是更好,所以去吧。
(*)在Android上,情况可能会有所不同,因为它不如服务器类JVM那么聪明。
答案 1 :(得分:1)
这取决于字段的类型(" Obj.var"):
如果是原始类型(int
,float
,char
等),您可能无法看到效果的影响(因为原始类型很小:long
和double
最多8个字节。
如果它是一个Object本身(包括基元数组),将它分配给局部变量不会改进任何东西,因为分配的是对Object的引用,所以通过访问本地副本你基本上将访问原始对象(Obj.var)。说到本地副本,有一种方法可以创建" true"通过克隆此变量(如果Obj.var的类型支持它),本地副本(即独立于原始Object Obj.var的那个,而不仅仅是对同一对象的另一个引用)。但是通过这样做,你可能会松散而不是获得一点性能,如果有的话:除了访问对象的所有费用(你在任何一种情况下支付),你还将支付克隆费用(将对象复制到本地范围。