【问题标题】:Java 8 - Does it consume more resources to have many methods?Java 8 - 拥有许多方法会消耗更多资源吗?
【发布时间】:2017-09-18 16:03:14
【问题描述】:

例如,在显微镜下观察代码时,第一个代码块是否比第二个代码块使用更多的计算时间?

代码块 1:

method1() {
do something;
call method2;
}
method2() {
do something simple like assign a variable value;
}

代码块 2:

method1(){
do something;
do something simple like assign a variable value;
}

很简单,但我想看看这里是否有人知道考虑这一点的价值(例如优化程序以缩短计算时间)。

作为一个例子,我了解到电路中的门具有有限的“Delta 延迟”,在考虑设计中的时钟速度时,可以将其相加来查看电路将具有的最大延迟。 Java有类似Delta延迟的东西吗?

【问题讨论】:

  • 在您可以通过基准测试证明这是您遇到的最重要的性能问题之前,不要浪费您的时间担心这个问题。如果 JIT 确定方法更好,它将内联方法;你应该专注于编写可读、可维护的代码。
  • 您实际上可以通过使用短方法获得性能。一旦我手动拆分了一个很长的方法并获得了 40% 的速度。 JIT 可以内联,但不能“概述”方法,因此可读性和性能通常呈正相关。

标签: java optimization java-8 mathematical-optimization


【解决方案1】:

也许,也许不是。通过称为内联的过程,JVM 可以像执行第二个代码一样执行第一个代码。见What is method inlining?

无论如何,在编写重要的应用程序时,您应该关注可读性和可维护性,而不是最小的性能提升。在大多数情况下,资源使用方面的差异几乎不会(如果有的话)是明显的。另一方面,对于人类读者来说,一个冗长的方法会做太多不同的事情,这可能是一种真正的痛苦。

【讨论】:

    【解决方案2】:

    这实际上取决于method2() 中的内容以及堆栈中的参数数量。经验法则是,通过降低代码可维护性将方法组合在一起绝不是一个好主意,速度上的罕见节省接近统计上的侥幸,而在逻辑中引入错误或减速的机会要高得多。

    如果您真的那么关心性能,我建议您使用例如学习 JMH 和微基准测试。 this tutorial。这将非常有启发性,并且随着时间的推移您将了解某些模式。

    例如以某种风格进行编码可以让您的数据完全驻留在 CPU 缓存中,从而提供数量级的速度提升,而额外的方法调用在绝对最坏的情况下可能只需要几个百分点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-03
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多