【问题标题】:Which one is faster/better/more memory efficient?哪个更快/更好/内存效率更高?
【发布时间】: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


【解决方案1】:

mySheet 对象是从堆栈到真实对象的引用。这意味着,当堆栈完成时(函数结束),指针将不再存在(垃圾收集器不清理堆栈 - 仅堆内存)

【讨论】:

    猜你喜欢
    • 2019-11-22
    • 2016-06-11
    • 2011-03-09
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    相关资源
    最近更新 更多