【发布时间】:2020-06-18 03:48:13
【问题描述】:
我正在研究一些由其他人编写的旧软件。 我经常看到类似于此示例的代码,我认为这不是最好的方法:
public Map<String, Sheet> getCalcedSheets() {
Sheet mySheet = this.doSomeBigCalculationsAndGiveMeMySheet();
return mySheet;
}
最好不要初始化类表的实例,而只返回方法返回的内容吗? 像这样:
public Map<String, Sheet> getCalcedSheets() throws Exception {
return this.doSomeBigCalculationsAndGiveMeMySheet();;
}
我认为这对 CPU 更友好,因为不会初始化 Sheet 的实例。 而且 mySheet 不会在创建后立即被垃圾收集。
你怎么看?
【问题讨论】:
-
它们完全一样。两者都没有比另一个创建更多的对象。其中一个有一个额外的局部变量,但这对代码的行为没有任何影响。使用更清晰的阅读方式。
-
mySheet是一个参考。引用不是 gc'd,只有对象是。在性能上绝对没有任何区别。 唯一的区别在于源代码中的行数。甚至生成的字节码也是一样的。不要试图通过猜测来优化,你不太可能猜对。 -
@Kayaman 不是 100% 正确,字节码不同(使用 OpenJDK 13 编译器)和堆栈使用也不同。也许 JIT 在运行时确实会消除它,请参阅 this Gist
-
@user85421 JIT 肯定会。我犯了假设的错误。我想那句老话仍然适用,
javac不会优化。 -
@Kayaman 不会很好,例如对于依赖于字节码编织的工具(AspectJ、Mockito、...)
标签: java performance memory