-6

从下面的 for 循环中,哪一个在 java 中更快

  1. for(int i = 100000; i > 0; i--) {}
  2. for(int i = 1; i < 100001; i++) {}

请提供速度的宝贵理由。这确实有助于我提高应用程序的性能。

4

5 回答 5

7

Java 语言的规范没有指定执行某些语句需要多长时间,因此您的问题没有答案。

一个足够聪明的编译器可以自由地将这两个语句编译为无操作并且仍然是合规的。事实上,JIT 很可能在这两种情况下都会这样做。

于 2012-05-11T15:01:58.560 回答
5
  1. 不能说总体上哪个会更快。它取决于平台、指令集、JIT 编译器等。

  2. 这个 JIT 编译器可能会完全优化循环......在你的例子中......因为循环体是空的,并且代码显然不会影响整体计算。

  3. 假设真正的代码没有空循环,实际的循环体(可能是循环之前/之后的内容)将强烈影响为循环生成的代码,从而影响其性能。

  4. 选择一个版本而不是另一个版本可能不会对应用程序的整体性能产生重大影响。

  5. 如果您仍然相信这会有所作为,那么就对您的应用程序进行双向编码,并测试实际性能。但请注意,您从测试中得到的答案会因代码的不同上下文、循环体中的不同内容、不同的编译器、硬件等而有所不同。(并注意 Java 中的微基准测试的缺陷;例如,@Vulcan 在尝试测量示例代码的性能时遇到的问题。)

  6. 以不明显/扭曲的方式编写代码实际上可能会阻止 JIT 编译器的优化器产生最优值。优化器通常被调整为专注于可能出现在典型程序中的代码模式。花时间寻找很少使用的晦涩代码模式只会让 JIT 编译器变慢。


您问这个问题的事实表明您犯了“过早优化”的错误。与其浪费时间,不如直接编写代码,让它工作,然后使用真实输入对其进行分析。使用分析器输出来指导您花时间手动优化的成果。

于 2012-05-11T15:05:54.813 回答
2

我非常怀疑这实际上会影响您的应用程序的性能。 过早的优化是万恶之源。

在优化之前,使用分析器找出应用程序中的瓶颈所在。

于 2012-05-11T15:03:00.523 回答
1

增量和减量之间的区别无关紧要,但是当您考虑到该循环主体中正在执行的确切内容时,这两者之间很可能存在重要区别——显然没有办法对此给出任何一般性陈述.

于 2012-05-11T15:49:18.823 回答
0

我想没关系。它们都以相同的方式执行。为什么?嗯,有一种叫做 Java 虚拟机的东西,我很确定它已经过优化,可以将两者识别为同一个句子。

于 2012-05-11T15:02:29.277 回答