逻辑内联与调用方法的效率?

isq*_*edr 11 java optimization profiling

我目前与我的第二年JAVA教授有分歧,我希望你们都能帮忙解决:

我们开始的代码是这样的:

   public T peek()
   {
       if (isEmpty())
       .........
   }
   public boolean isEmpty() 
   {
       return topIndex<0;
   }
Run Code Online (Sandbox Code Playgroud)

并且她希望我们删除isEmpty()引用并将其代码直接放入if语句中(即将peek方法内容更改为:) if(topIndex<0).......以"使代码更高效".我认为a)运行时/编译时优化器很可能已经内联,isEmpty() call, b)即使它没有,5-10机器操作在几乎所有情况下都可以忽略不计,并且c)它的坏风格因为它使得程序可读性较差,变化较小.

所以,我想我的问题是:内联逻辑与仅调用方法相比,是否有任何运行时效率?我尝试过简单的分析技术(又名长循环和秒表),但测试尚无定论.

编辑:

谢谢大家的回复!我很感谢你们所有的时间.此外,我感谢那些评论与我的教授争论的实用主义,特别是在没有数据的情况下这样做的人.@Mike Dunlavey我很欣赏你作为前教授的见解以及你对适当编码顺序的建议.@ya_pulser我特别感谢您花时间分享的分析建议和链接.

ya_*_*ser 9

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

您可以使用JMH(http://openjdk.java.net/projects/code-tools/jmh/)创建一个小基准测量并测量以下差异:

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

请阅读http://www.oracle.com/technetwork/java/whitepaper-135217.html#method

有用的参数可能是:

  • -Djava.compiler = NONE
  • -XX:+ PrintCompilation

另外每个jdk版本都有自己的一组参数来控制jit.

如果您将创建一些图形作为您的研究结果,并将礼貌地呈现给教授 - 我认为它将在未来受益.

我认为/sf/users/182971981/可以帮助解决与jmh相关的问题.

BTW:当我将大量方法编入一个巨大的代码循环以实现神经网络反向传播例程的最大速度时,我取得了巨大的成功,因为java(使用方法的方法)对内联方法过于懒惰.这是不可维护和快速:(.


Mik*_*vey 8

伤心...

我同意你对它的直觉,特别是"在几乎所有情况下,5-10机器操作都可以忽略不计".

很久以前我是CS教授.一方面,教授们需要你能给予他们的一切懈怠.教学要求很高.你不能有一个糟糕的一天.如果你出现在上课并且你没有做好充分的准备,那么你就是在艰难的旅程中.如果你在星期五进行测试并且周一没有成绩,学生会说"但你整个周末都有!" 你可以通过看到你的学生学习来获得满足感,但除了如何教学之外,你自己学不会多学.

另一方面,很少有教授在真实软件方面有很多实践经验.所以他们的意见倾向于建立在各种教条的证据上,而不是坚实的实用主义.

性能就是一个很好的例子.他们倾向于说"不要做X.做Y因为它表现得更好".这完全忽略了关于性能问题的观点 - 你必须处理分数而不是绝对数.一切都取决于什么别的是怎么回事.接近表现的方式是,正如有人说的那样"先做对了.然后快点做".

你加快速度的方式不是通过观察代码(并且想知道"我应该这样做,还是应该这样做"),而是通过运行它并让它告诉你它是如何花时间的.分析的基本思想是如何执行此操作.现在有这样的事,作为不良分析和良好的分析,因为在这里的第二个答案解释(通常当教授教分析,他们教坏的那种),但是这是要走的路.


hug*_*ugh 5

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

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

另外,只是一个实用的注释 - 在学校和专业发展中,我们都必须遵守我们个人不同意的编码标准.这是一项重要的技能,对于团队合作来说确实是必要的,即使它确实很糟糕.