Java 让逻辑在线与调用方法的效率?

Java 让逻辑在线与调用方法的效率?,java,optimization,profiling,Java,Optimization,Profiling,我目前与我的二年级JAVA教授有一个分歧,我希望你们都能帮助解决这个问题: 我们从以下代码开始: public T peek() { if (isEmpty()) ......... } public boolean isEmpty() { return topIndex<0; } publictpeek() { if(isEmpty()) ......... } 公共布尔值为空() { return top

我目前与我的二年级JAVA教授有一个分歧,我希望你们都能帮助解决这个问题:

我们从以下代码开始:

   public T peek()
   {
       if (isEmpty())
       .........
   }
   public boolean isEmpty() 
   {
       return topIndex<0;
   }
publictpeek()
{
if(isEmpty())
.........
}
公共布尔值为空()
{

return topIndex正如您所说,差异将很小,在大多数情况下,可读性应该是更高的优先级。不过,在这种情况下,由于额外的方法由一行组成,我不确定这是否会增加任何真正的可读性好处,除非您从其他地方调用相同的方法


也就是说,记住你的讲师的目标是帮助你学习计算机科学,这与编写生产代码是不同的优先事项。特别是,她不希望你把优化留给自动化工具,因为这对你的学习没有帮助


另外,这只是一个实用的注意事项——在学校和专业发展中,我们都必须遵守我们个人不同意的编码标准。这是一项重要的技能,对于团队合作来说确实是必要的,即使这会让人恼火。

调用
是空泛的
是惯用的,可读性很好。
手动内联,这将是一个微观优化,
在性能关键的情况下做得最好,
在预定生产环境中通过基准测试确认瓶颈之后

手动内联是否有真正的性能优势? 理论上是的,也许这就是讲座想要强调的。 实际上,, 我认为你不会找到一个绝对的答案。 自动内联行为可能依赖于实现。 还要记住,基准测试结果将取决于JVM实现、版本和平台。 因此, 这种优化在罕见的极端情况下非常有用, 而且通常不利于可移植性和可维护性

按照同样的逻辑,我们是否应该内联所有方法, 以复制大块代码为代价消除所有间接操作? 绝对不是。 分解和内联之间的界限可能也取决于个人品味,
在某种程度上。

你对java代码行为的假设是正确的,但你对教授没有数据的争论是不礼貌的:)。没有数据的争论是毫无意义的,用测量和图表来证明你的假设

您可以使用JMH()创建一个小基准,并测量以下各项之间的差异:

  • 手动内联(删除isEmpty方法并将代码放置在调用位置)
  • 由java jit编译器内联(100k(?)调用后的热点-请参阅jit打印编译输出)
  • 已完全禁用热点内联
请阅读

有用的参数可以是:

  • -Djava.compiler=NONE
  • -XX:+打印编译
另外,每个jdk版本都有自己的一组参数来控制jit

如果您将创建一些图形集作为您的研究结果,并礼貌地将它们呈现给教授-我认为这将对您未来有所裨益

我认为这有助于解决与jmh相关的问题

顺便说一句:当我将大量方法内联到一个巨大的代码循环中以实现神经网络反向传播例程的最大速度时,我取得了巨大的成功,因为java太懒了,无法将方法与方法内联。它无法维护且速度快:(.

悲伤

我同意你的直觉,尤其是“在几乎所有情况下,5-10台机器的操作都可以忽略不计”

很久以前我是一名C.S.教授。 一方面,教授们需要你给他们的所有空闲时间。 教学要求很高,你不会有不愉快的一天。 如果你出现在课堂上,而你没有做好充分的准备,你将面临一场艰难的旅程。 如果你星期五考试,星期一没有成绩,学生们会说:“但是你整个周末都在考试!” 你可以从学生的学习中获得满足感,但你自己除了如何教学之外,学的不多

另一方面,很少有教授在实际软件方面有丰富的实践经验。 因此,他们的观点倾向于建立在各种教条式的确信之上,而不是坚实的实用主义

性能就是一个很好的例子。 他们倾向于说“不要做X,做Y,因为它表现得更好。”这完全没有抓住性能问题的关键——你必须以分数而不是绝对分数来处理问题。一切都取决于其他方面的情况。 接近性能的方法是,正如有人所说的“先把它做好,然后再把它做得快。”

而让它快速运行的方法不是盯着代码看(想知道“我应该这样做还是应该那样做”),而是运行它,让它告诉你它是如何花费时间的。 评测的基本思想是如何做到这一点。
现在有坏的评测和好的评测(通常当教授教授教授评测时,他们教授的是坏的评测),但这就是方法。

另一种形式的数据可能是生成的代码。请参阅
-XX:+printsassembly
选项和朋友。有关更多信息,请参阅


我相信,在这种特殊情况下,Hotspot JVM将内联调用
isEmpty
,不会有性能差异。

我认为你是对的,但与教授争论是没有意义的。在生活中,有时你必须按照别人告诉你的那样更正代码。你几乎肯定是对的,但也许你的教授是对的目的是让学生们自己发现这种微观优化的毫无意义。感叹过早优化是万恶之源。但与你的教授发生冲突也不是明智的选择。下面是我为C#回答的一个类似问题。C#和Java之间的值在短期内不会有很大的不同方法调用…@displayName:实际上,它们可能不同,因为最广泛使用的实现