以下两个代码段之间的效率是否存在差异?第一个是否需要它为对象分配内存?
Class c = a.getClass();
if(str != null)
c.dosomething(c.getX())
if(a.getClass() != null)
a.getClass().doSomething(a.getClass().getX());
答案 0 :(得分:1)
第一个将更有效,特别是如果getObject方法很昂贵。 如果为c分配了任何内存,则在getObject方法中完成。
答案 1 :(得分:1)
哪个更有效,实际上取决于运行代码时JIT编译器和JVM的作用。由于这些依赖于平台和实现,因此很难给出明确的答案。
应该在getClass()
方法中分配为Class对象c分配的内存。函数中的c只是一个引用,很可能存储在寄存器中,因此需要进行内存分配。与在寄存器中存储数据相比,函数调用相对昂贵。我怀疑JIT是否足够聪明,可以将第二个片段的字节码重构为第一个片段,所以第一种方法很可能会更快。
但是,为了代码风格,你应该总是使用第一种方法。
答案 2 :(得分:0)
第一种形式可能会更有效率。 (如果代码是JIT编译的话,很难想象如何降低效率。)
如果JIT编译器可以向自己证明对getClass()
的第二次和后续调用是无副作用并产生相同的结果,那么它可以重用第一次调用返回的值。这将使第二种形式的表现与第一种形式一样快。
JIT是否实际执行此优化将取决于JVM。我的直觉是当前一代JIT可能不会这样做,但我可能错了。您需要转储JIT编译的本机代码才能确定。
值得注意的是:
getClass()调用(假设它没有被覆盖)将相对便宜。它所做的只是查找对应于对象标题中某些内容的现有Class
对象。 (我们知道它不会每次都创建一个新的Class
对象,因为Java规范说Class
个对象和Java类型之间存在一对一的关系......)
除非此代码是性能瓶颈,否则它将不会对应用程序的整体速度产生重大影响。 (注意过早优化......)