Java方法vrs引用性能

use*_*607 1 java methods reference

我更喜欢尽可能少地调用一个方法,因为我认为调用方法的性能成本大于仅调用一次并保持引用的性能成本.问题是我认为我在大学时从C++那里得到了这个观点,从那时起事情发生了很大的变化.

哪个更便宜?

something.getOrDoSomething();
something.getOrDoSomething();
Run Code Online (Sandbox Code Playgroud)

要么

Thing thing1 = something.getOrDoSomething();
//use thing1 from now on.
Run Code Online (Sandbox Code Playgroud)

现在我知道一个方法可能包含任何内容,所以我们假设它们没有.它们只是简单的吸气剂.我应该注意JVM性能优化吗?

我想澄清一下,因为我在遗留代码中已经看到了很多.

Lui*_*oza 5

既然你在问性能:它.不.物.

JVM中的JIT将在运行时优化字节码,这些选项的执行速度将比您想象的更快.不要担心这种微观优化,除非它已经证明这是你的应用程序的瓶颈,并通过使用像分析器这样的工具来证明.

来自你的评论:

如果开发人员习惯于这种方式进行编码,他们最终可能不会重复调用一种方法来做一些不仅仅是获取的东西吗?

在这里,您关注的不仅仅是性能.这里的答案是:对于所使用的代码部分或代码可读性而言,这是一个有用的问题:

  • 如果你通过一段代码对这个getter进行很少的调用并且它用于小目的,那么使用getter.
  • 如果您需要在一段代码中多次访问此字段,并且需要通过对此引用所做的更改进行调试,则必须先将其存储在变量中,然后再使用它.

要考虑的另一个因素是得墨忒耳定律:

  • 每个单位应该对其他单位的知识有限:只有与当前单位"密切"相关的单位.
  • 每个单位只应与其朋友交谈; 不要和陌生人说话.
  • 只与你的直接朋友交谈.

例如,这是一段代码,如下所示:

public void someMethod(Foo foo) {
    logger.info(foo.getBar().getFirstName());
    logger.info(foo.getBar().getLastName());
    logger.info(foo.getBar().getBirthday());
    logger.info(foo.getBar().getBaz().getSomefield());
    //and probably more other operations not directly involved with logger.info...
}
Run Code Online (Sandbox Code Playgroud)

它应该改写为:

public void someMethod(Foo foo) {
    Bar bar = foo.getBar();
    logger.info(bar.getFirstName());
    logger.info(bar.getLastName());
    logger.info(bar.getBirthday());
    Baz baz = bar.getBaz();
    logger.info(baz.getSomefield());
    //and on...
}
Run Code Online (Sandbox Code Playgroud)