1

下面的 2 个代码片段之间的效率有什么区别吗?第一个是否需要它为对象分配内存?

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

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

3 回答 3

1

第一个会更有效,尤其是在 getObject 方法很昂贵的情况下。如果为 c 分配了任何内存,这将在 getObject 方法中完成。

于 2012-08-05T01:43:19.123 回答
1

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

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

但是,为了代码风格,您应该始终使用第一种方法。

于 2012-08-05T02:26:06.980 回答
0

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

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

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

值得注意的是:

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

  2. 除非此代码是性能瓶颈,否则您实现此代码的方式不会对应用程序的整体速度产生重大影响。(提防过早的优化...)

于 2012-08-05T03:07:12.317 回答