2017-04-21 49 views
-1

例如,在显微镜下查看代码时,第一个代码块的计算时间是否比第二个代码块的计算时间多?Java 8 - 是否消耗更多资源以拥有多种方法?

代码块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延迟?

+12

不要浪费你的时间担心这一点,直到你可以通过基准测试来证明这是你最重要的性能问题。如果JIT认为更好,JIT将内联;你应该专注于编写可读,可维护的代码。 –

+3

您可能实际上通过使用简短的方法获得了性能。一旦我手动分割一个非常长的方法,并获得40%的速度。 JIT可以内联,但不是“轮廓”方法,所以可读性和性能往往是正相关的。 – maaartinus

回答

6

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

无论如何,在编写非平凡的应用程序时,您应该关注可读性和可维护性,而不是最小的性能收益。在大多数情况下,资源使用方面的差异几乎不会显着。另一方面,对于人类读者来说,做太多不同事情的长期方法可能是一个真正的痛苦。

4

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

如果你真的关心性能,那么我建议你学习使用JMH和微型基准测试。 this tutorial。这将是非常明显的,随着时间的推移,你将了解某些模式。

E.g.以某种风格进行编码可以使您的数据完全驻留在CPU缓存中,从而提高数量级的速度,而对于额外的方法调用,绝对最差的情况下可能需要几分之一的百分点。