目前,我和我的第二年的JAVA教授有分歧,希望你们能帮我解决这个问题:
我们开始的代码是:
public T peek()
{
if (isEmpty())
.........
}
public boolean isEmpty()
{
return topIndex<0;
}她希望我们删除isEmpty()引用,并将其代码直接放入if语句(即将peek方法内容更改为:if(topIndex<0).......)以“提高代码的效率”。我认为:( a)运行时/编译时间优化器很可能已经嵌入了isEmpty() call, b),即使它没有,5-10机器操作在几乎每种情况下都是可以忽略不计的,而c)它只是糟糕的风格,因为它使程序的可读性更低,变化更少。
所以,我想我的问题是:与调用方法相比,内联逻辑是否提高了运行时的效率?我尝试过简单的分析技术(也就是长循环和秒表),但是测试没有定论。
编辑:
谢谢大家的回复!我很感激你们能抽出时间。此外,我也感谢你们中的一些人评论了与我的教授争论的实用主义,尤其是在没有数据的情况下。@迈克邓拉维,我感谢你作为一名前教授的洞察力和你对适当的编码序列的建议。@ya_pulser我特别感谢您花时间分享的分析建议和链接。
发布于 2015-10-03 11:40:19
您对java代码行为的假设是正确的,但是您对您的教授在没有数据的情况下进行争论是不礼貌的:)。在没有数据的情况下争论是没有意义的,用测量和图表来证明你的假设。
您可以使用JMH ( http://openjdk.java.net/projects/code-tools/jmh/ )创建一个小的基准和度量以下之间的差异:
请阅读http://www.oracle.com/technetwork/java/whitepaper-135217.html#method
有用的参数可以是:
另外,每个jdk版本都有自己的一组参数来控制jit。
如果你要创建一些图形作为你的研究结果,并礼貌地将它们呈现给教授--我认为这将在将来对你有益。
我认为https://stackoverflow.com/users/2613885/aleksey-shipilev可以帮助解决与jmh相关的问题。
顺便说一句,当我将大量的方法嵌入到一个巨大的代码循环中,以达到最大速度的神经网络反向传播例程时,我取得了很大的成功。太懒了,以至于不能用方法内联方法。它是不可维护的,而且速度很快。
发布于 2015-10-03 15:25:51
悲伤..。
我同意你对此的直觉,尤其是“几乎在每一种情况下,5-10机器的操作都是微不足道的”。
很久以前我是个C.S.教授。一方面,教授们需要所有你能给他们的放松。教学要求很高。你不会有糟糕的一天的。如果你出现在课堂上,而你没有做好充分的准备,那么你将面临一段艰难的旅程。如果你在星期五考试,周一没有成绩,学生们会说:“但你整个周末都有!”你可以从你的学生学习中获得满足感,但除了如何教学之外,你自己并没有学到多少东西。
另一方面,很少有教授对实际软件有丰富的实践经验。因此,他们的观点往往建立在各种教条主义的确定性之上,而不是坚实的实用主义。
性能就是一个很好的例子。他们倾向于说:“不要做X,做Y,因为它表现得更好。”这完全忽略了性能问题的重点-你必须处理分数,而不是绝对。一切都取决于还发生了什么。接近表现的方法是,就像有人说的,“先做对,然后快做。”
让它变得更快的方法不是盯着代码(并且想知道“我应该这么做,还是应该这么做”),而是运行它并让它告诉您它是如何花费时间的。分析的基本思想是如何做到这一点。现在有了坏的剖析和好的剖析,http://archive.is/9r927 (通常当教授教授教剖析,他们教不好的那种),但这是走的路。
发布于 2015-10-03 10:45:20
正如您所说,差别很小,在大多数情况下,可读性应该是一个更高的优先级。但是,在这种情况下,由于额外的方法由一行组成,除非从其他地方调用相同的方法,否则我不确定这会增加任何真正的可读性好处。
尽管如此,记住您的讲师的目标是帮助您学习计算机科学,这是一个不同的优先事项,编写生产代码。特别是,她不希望您将优化留给自动化工具,因为这无助于您的学习。
另外,在学校和专业发展中,我们都必须坚持我们个人不同意的编码标准。这是一项重要的技能,而且对于团队合作来说也是必要的,即使它确实令人恼火。
https://stackoverflow.com/questions/32921523
复制相似问题