Java循环效率。如果 - 继续或如果

时间:2010-10-08 04:44:55

标签: java loops performance if-statement continue

今天在完成任务时正在考虑的问题是循环效率。

让我们说。我有一个数组{'a','x','a','a'} 并且应该避免'x'元素的循环 现在我想知道这两种方法在效率方面是如何不同的 - 不采取时间或者做什么或者进行循环区分

char[] arrExample = {'a','x','a','a'};
for(int idx = 0; idx<arrExample.length; idx++){
    if(arrExample[idx] == 'x')
        continue;

    System.out.println(arrExample[idx]);
}

并且公共循环看起来像这样

char[] arrExample = {'a','x','a','a'};
for(int idx = 0; idx<arrExample.length; idx++){
    if(arrExample[idx] != 'x')
        System.out.println(arrExample[idx]);
}

所以...专家评论很高兴。谢谢!

7 个答案:

答案 0 :(得分:5)

即使您使用了非优化的字节码,它也几乎完全相同。只有两个真正的差异。首先是跳转语句的位置,但该跳转语句仍将执行相同的次数。此外,==和!=运算符都是原子运算符,执行两者都需要相同的时间。

如前所述,使用对你有意义的东西。但我必须承认,继续声明版本的阅读相当尴尬。

答案 1 :(得分:3)

优化编译器将为两者生成基本相同的指令。使用对你更有意义的。

答案 2 :(得分:3)

我会说,如果你担心的话,你看的方式太低了。可能的是,没有明显的差异。

我对编码的偏好通常不会继续使用,而是使用!=代替,因为它往往会导致更好的代码......但这并不总是正确的。

除非速度证明是一个问题,否则首选代码清晰度/准确性。

答案 3 :(得分:3)

除非您在真实输入上分析了应用程序,并确定此特定循环需要花费大量时间,否则您不必担心在此级别手动优化代码:

  • 这个特殊的循环可能对整体表现不重要。
  • 你正在考虑的改变可能没有任何区别。
  • 即使这样,最有效的代码也有可能依赖于硬件平台和JVM版本。 (JIT编译器不断得到改进。)

事实上,Sun人员已经说过,通过以复杂的方式编写代码,实际上可以让JIT优化器很难做好。因此,虽然一些手部优化可能会提高一个JVM版本的性能,但同样的优化实际上可能会使另一个版本的性能变差。

答案 4 :(得分:2)

性能方面你没有看到太多差异,但第二个看起来很可读。

即使存在(非常小的)性能差异,我也会选择第二种。

答案 5 :(得分:1)

如果你真的非常关心这个循环的效率,那么你看到它有两个选择:

  • 测量它(在你关心的平台上)
  • 检查生成的字节码,以查看哪一个更有效。

但实际上,正如Amber指出的那样,你应该用一个半合适的编译器得到相同的字节码。所以使用任何更清晰的感觉。对我而言,尤其是对于if更大的身体,继续使它更清晰。

答案 6 :(得分:0)

两个循环的复杂性相等,它们都不会给你带来显着的差异。我个人而言,不想为了节省一些微秒而牺牲代码可读性。

假设您选择上述实现之一。不同的编译器会产生不同的优化,你的“微秒节省”可能会消失。

在代码可读性方面,我更喜欢没有'continue'或'break'的那个。