访问对象或创建引用对象之间的效率差异?

时间:2012-08-05 01:36:44

标签: java reference performance

以下两个代码段之间的效率是否存在差异?第一个是否需要它为对象分配内存?

Class c = a.getClass();
if(str != null)
    c.dosomething(c.getX())

if(a.getClass() != null)
    a.getClass().doSomething(a.getClass().getX());

3 个答案:

答案 0 :(得分:1)

第一个将更有效,特别是如果getObject方法很昂贵。 如果为c分配了任何内存,则在getObject方法中完成。

答案 1 :(得分:1)

哪个更有效,实际上取决于运行代码时JIT编译器和JVM的作用。由于这些依赖于平台和实现,因此很难给出明确的答案。

应该在getClass()方法中分配为Class对象c分配的内存。函数中的c只是一个引用,很可能存储在寄存器中,因此需要进行内存分配。与在寄存器中存储数据相比,函数调用相对昂贵。我怀疑JIT是否足够聪明,可以将第二个片段的字节码重构为第一个片段,所以第一种方法很可能会更快。

但是,为了代码风格,你应该总是使用第一种方法。

答案 2 :(得分:0)

第一种形式可能会更有效率。 (如果代码是JIT编译的话,很难想象如何降低效率。)

如果JIT编译器可以向自己证明对getClass()的第二次和后续调用是无副作用并产生相同的结果,那么它可以重用第一次调用返回的值。这将使第二种形式的表现与第一种形式一样快。

JIT是否实际执行此优化将取决于JVM。我的直觉是当前一代JIT可能不会这样做,但我可能错了。您需要转储JIT编译的本机代码才能确定。

值得注意的是:

  1. getClass()调用(假设它没有被覆盖)将相对便宜。它所做的只是查找对应于对象标题中某些内容的现有Class对象。 (我们知道它不会每次都创建一个新的Class对象,因为Java规范说Class个对象和Java类型之间存在一对一的关系......)

  2. 除非此代码是性能瓶颈,否则它将不会对应用程序的整体速度产生重大影响。 (注意过早优化......)