Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问对象或创建引用对象的效率有什么不同?_Java_Reference_Performance - Fatal编程技术网

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编译的本机代码才能确保

值得注意的是:

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

  • 除非这段代码是一个性能瓶颈,否则它不会对应用程序的总体速度产生重大影响,而您采用的是哪种实现方式。(谨防过早优化…)


  • 取决于发生了什么。你真的是指
    java.lang.Class
    java.lang.Object.getClass
    ,还是仅仅是“
    Something
    ”和“
    getSomething
    ”?我的意思是“某物”和“getSomething”是任意的