java中哪个for循环更快?为什么

java中哪个for循环更快?为什么,java,Java,从下面的for循环中,哪一个在java中更快 for(inti=100000;i>0;i--){} for(inti=1;i

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

  • for(inti=100000;i>0;i--){}
  • for(inti=1;i<100001;i++){}

  • 请提供速度提高的重要原因。这确实有助于提高应用程序的性能。

    没有指定执行某些语句所需的时间,因此您的问题没有答案


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

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

    我非常怀疑这是否会影响应用程序的性能

    在优化应用程序之前,请使用查找工具找出应用程序中的瓶颈所在

  • 一般来说,不可能说哪一个会更快。它取决于平台、指令集、JIT编译器等

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

  • 假设实际代码没有空循环,实际的循环体(以及循环之前/之后的内容)将强烈影响为循环生成的代码,从而影响其性能

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

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

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



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

    增量和减量之间的差异无关紧要,然而,当你准确地考虑到在循环体中执行的是什么时,这两者之间很可能有一个重要的区别——显然没有办法给出任何关于这一点的一般性陈述。

    我不能肯定地说,但我认为JVM会优化类似的东西,不管你使用什么。如果你能测量差异,我会给你买一个松饼。“这真的有助于我提高应用程序的性能”-不,不会的。@Vulcan-跟我说。“我必须在测量前预热JVM”。您很可能看到JIT编译过程的一个工件。@alpha123-相反,它很可能会将它们优化为零。嗯,我不明白这一点。我很确定JLS也没有指定
    inti=0++一,
    比100万个字符串的冒泡时间要长,但我很有信心它不会。底线是,如果没有关于编译器、硬件、JVM(如果前面提到的编译器甚至针对java字节码)、JIT编译器等的进一步信息,就不可能知道了。对于类似OP的问题,我完全同意。我想说的是,仅仅因为JLS没有指定某些东西,并不意味着你不能合理地预测它的性能特征。如果问题询问递增一个int是否比排序一百万个字符串并将其写入磁盘慢,JLS仍然没有指定每个字符串需要多长时间,但在实践中肯定有答案。@yshavit-您的论点是正确的,但没有帮助。我们无法做出任何合理预测的真正原因是可能执行的优化的可变性和复杂性。。。取决于平台、JVM版本等。此答案没有帮助,相同问题的更好答案可以在此处找到: