Java 访问对象或创建引用对象的效率有什么不同?
下面的两段代码在效率上有什么不同吗?第一个是否需要它为对象分配内存Java 访问对象或创建引用对象的效率有什么不同?,java,reference,performance,Java,Reference,Performance,下面的两段代码在效率上有什么不同吗?第一个是否需要它为对象分配内存 Class c = a.getClass(); if(str != null) c.dosomething(c.getX()) if(a.getClass() != null) a.getClass().doSomething(a.getClass().getX()); 第一种方法效率更高,特别是如果getObject方法很昂贵的话。 如果为c分配了内存,那么这是在getObject方法中完成的。哪个更有效实
Class c = a.getClass();
if(str != null)
c.dosomething(c.getX())
if(a.getClass() != null)
a.getClass().doSomething(a.getClass().getX());
第一种方法效率更高,特别是如果getObject方法很昂贵的话。
如果为c分配了内存,那么这是在getObject方法中完成的。哪个更有效实际上取决于JIT编译器和JVM在运行代码时所做的工作。因为这些都依赖于平台和实现,所以很难给出明确的答案 为类对象c分配的任何内存都应该在
getClass()
方法中分配。函数中的c只是一个引用,很可能存储在寄存器中,因此需要内存分配。与在寄存器中存储数据相比,函数调用相对昂贵。我怀疑JIT是否足够聪明,可以将第二个代码段的字节码重构为第一个代码段,所以第一个方法很可能会更快
但是,出于代码风格的考虑,您应该始终使用第一种方法。第一种方法可能更有效。(很难想象,如果代码是JIT编译的,效率会如何降低。) 如果JIT编译器可以向自己证明对
getClass()
的第二次调用和后续调用没有副作用,并且产生相同的结果,那么它可以重用第一次调用返回的值。这将使第二种形式的表现和第一种形式一样快
JIT是否真的进行/能够进行这种优化将取决于JVM。我的直觉是,现在的JIT可能不会这样做,但我可能错了。您需要转储JIT编译的本机代码才能确保
值得注意的是:
类
对象,该对象对应于对象标题中的某个内容。(我们知道它不会每次都创建一个新的类
对象,因为Java规范说类
对象和Java类型之间存在一对一的关系…)取决于发生了什么。你真的是指
java.lang.Class
和java.lang.Object.getClass
,还是仅仅是“Something
”和“getSomething
”?我的意思是“某物”和“getSomething”是任意的