Java 频繁访问对象属性是否会带来成本?
在编写代码时,我最常遵循的一点是,如果我看到某个对象属性或方法在同一个方法中被多次访问,我倾向于将其分配给一个变量,并在任何地方重复使用它Java 频繁访问对象属性是否会带来成本?,java,code-formatting,code-readability,Java,Code Formatting,Code Readability,在编写代码时,我最常遵循的一点是,如果我看到某个对象属性或方法在同一个方法中被多次访问,我倾向于将其分配给一个变量,并在任何地方重复使用它 List itemAList=alpha.doX(…,…,…) .peek(item->packagedItems.put(item.getName(),…) .peek(item->readyItems.put(item.getName(),…,…)) .map(项->转换(项.getName(),…) .collect(toList()); 正如我们所
List itemAList=alpha.doX(…,…,…)
.peek(item->packagedItems.put(item.getName(),…)
.peek(item->readyItems.put(item.getName(),…,…))
.map(项->转换(项.getName(),…)
.collect(toList());
正如我们所看到的,item.getName()
已经被多次使用。我通常会将其移动到一个变量并重新使用它:
String itemName=item.getName();
列表项列表=alpha.doX(…,…,…)
.peek(item->packagedItems.put(itemName,…)
.peek(item->readyItems.put(itemName,…))
.map(项目->转换(项目名称,…)
.collect(toList());
我有时也会在代码审查中提出同样的建议。但是,我现在想知道,与直接从变量访问相比,从对象实例取消引用是否会带来性能成本
关于这种做法有什么想法?在什么情况下(如果有的话),一个会比另一个好
谢谢。(忽略第二个代码中的错误,项已在使用中。)
当一个方法是final
时,编译器可以内联,因为这取决于编译器来确定该方法是否足够“简单”以进行内联。getter和setter通常足够简单,可以内联
如果不是这样,JIT很可能迟早会在运行时内联getter,因此无论哪种方式item.getName()
都将被item.name
性能问题不大。(忽略第二个代码中的错误,项
已在使用。)
当一个方法是final
时,编译器可以内联,因为这取决于编译器来确定该方法是否足够“简单”以进行内联。getter和setter通常足够简单,可以内联
如果不是这样,JIT很可能迟早会在运行时内联getter,因此无论哪种方式item.getName()
都将被item.name
性能问题不大。您发布的两个代码片段具有不同的语义。事实上,第二个版本甚至不应该编译,说明变量item
已经定义。即使要编译item->…(item.getName).
也是一个lambda函数,因此不等同于item->…(itemName).
。您发布的两个代码片段具有不同的语义。事实上,第二个版本甚至不应该编译,说明变量item
已经定义。即使要编译item->…(item.getName).
也是一个lambda函数,因此不等同于item->…(itemName).
。不应该依赖于方法的JIT内联。如果不经常调用getter,它将不会内联。(值得注意的是,当方法被视为“热”时,您可以配置阈值)。另外,如果一个类有任何继承自它的类,那么它的非final方法就不是内联的候选方法,不应该依赖于JIT内联方法。如果不经常调用getter,它将不会内联。(值得注意的是,当方法被视为“热”时,您可以配置阈值)。另外,如果一个类有任何继承自它的类,那么它的非final方法就不是内联的候选方法。